未验证 提交 50d2ff75 编写于 作者: G Gao Hongtao 提交者: GitHub

Parse TLS mode from ALS (#5454)

* Parse tls mode from als
Signed-off-by: NGao Hongtao <hanahmily@gmail.com>

* Polish code
Signed-off-by: NGao Hongtao <hanahmily@gmail.com>
上级 c408cf96
Subproject commit cdd58617e720949f51c0ddf5adf10b2b188e94fe
Subproject commit 9933e2d17078c2bf07cd1c8d5ef36d52b5cbb917
......@@ -133,6 +133,7 @@ Calculate the metrics data from each request between one service and the other s
| responseCode | Represent the response code of HTTP response, if this request is the HTTP call. | | int |
| type | Represent the type of each request. Such as: Database, HTTP, RPC, gRPC. | | enum |
| detectPoint | Represent where is the relation detected. Values: client, server, proxy. | yes | enum|
| tlsMode | Represent TLS mode between source and destination services. For example `service_relation_mtls_cpm = from(ServiceRelation.*).filter(tlsMode == "mTLS").cpm()` || string|
### SCOPE `ServiceInstanceRelation`
......@@ -154,6 +155,7 @@ Calculate the metrics data from each request between one service instance and th
| responseCode | Represent the response code of HTTP response, if this request is the HTTP call. | | int |
| type | Represent the type of each request. Such as: Database, HTTP, RPC, gRPC. | | enum |
| detectPoint | Represent where is the relation detected. Values: client, server, proxy. | yes | enum|
| tlsMode | Represent TLS mode between source and destination service instances. For example, `service_instance_relation_mtls_cpm = from(ServiceInstanceRelation.*).filter(tlsMode == "mTLS").cpm()` || string|
### SCOPE `EndpointRelation`
......
......@@ -103,6 +103,9 @@ public class ServiceInstanceRelation extends Source {
@Getter
@Setter
private DetectPoint detectPoint;
@Getter
@Setter
private String tlsMode;
@Override
public void prepare() {
......
......@@ -93,6 +93,9 @@ public class ServiceRelation extends Source {
@Getter
@Setter
private DetectPoint detectPoint;
@Getter
@Setter
private String tlsMode;
@Override
public void prepare() {
......
......@@ -18,6 +18,7 @@
package org.apache.skywalking.oap.server.receiver.envoy.als;
import com.google.common.base.Strings;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.protobuf.Duration;
import com.google.protobuf.Timestamp;
......@@ -28,6 +29,7 @@ import io.envoyproxy.envoy.data.accesslog.v2.AccessLogCommon;
import io.envoyproxy.envoy.data.accesslog.v2.HTTPAccessLogEntry;
import io.envoyproxy.envoy.data.accesslog.v2.HTTPRequestProperties;
import io.envoyproxy.envoy.data.accesslog.v2.HTTPResponseProperties;
import io.envoyproxy.envoy.data.accesslog.v2.TLSProperties;
import io.envoyproxy.envoy.service.accesslog.v2.StreamAccessLogsMessage;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.apis.CoreV1Api;
......@@ -43,6 +45,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
......@@ -68,6 +71,12 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
private static final String VALID_PHASE = "Running";
private static final String NON_TLS = "NONE";
private static final String M_TLS = "mTLS";
private static final String TLS = "TLS";
@Getter(AccessLevel.PROTECTED)
private final AtomicReference<Map<String, ServiceMetaInfo>> ipServiceMap = new AtomicReference<>();
......@@ -211,6 +220,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
downstreamLocalAddress.getSocketAddress()
.getAddress(), downstreamLocalAddress.getSocketAddress()
.getPortValue());
String tlsMode = parseTLS(properties.getTlsProperties());
if (cluster.startsWith("inbound|")) {
// Server side
if (downstreamService.equals(ServiceMetaInfo.UNKNOWN)) {
......@@ -229,6 +239,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
Math.toIntExact(responseCode))
.setStatus(status)
.setProtocol(protocol)
.setTlsMode(tlsMode)
.setDetectPoint(DetectPoint.server);
LOGGER.debug("Transformed ingress->sidecar inbound mesh metric {}", metric);
......@@ -252,6 +263,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
Math.toIntExact(responseCode))
.setStatus(status)
.setProtocol(protocol)
.setTlsMode(tlsMode)
.setDetectPoint(DetectPoint.server);
LOGGER.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric);
......@@ -281,6 +293,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.setResponseCode(Math.toIntExact(responseCode))
.setStatus(status)
.setProtocol(protocol)
.setTlsMode(tlsMode)
.setDetectPoint(DetectPoint.client);
LOGGER.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric);
......@@ -292,6 +305,21 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
return sources;
}
private String parseTLS(TLSProperties properties) {
if (properties == null) {
return NON_TLS;
}
if (Strings.isNullOrEmpty(Optional.ofNullable(properties.getLocalCertificateProperties())
.orElse(TLSProperties.CertificateProperties.newBuilder().build()).getSubject())) {
return NON_TLS;
}
if (Strings.isNullOrEmpty(Optional.ofNullable(properties.getPeerCertificateProperties())
.orElse(TLSProperties.CertificateProperties.newBuilder().build()).getSubject())) {
return TLS;
}
return M_TLS;
}
protected void analysisProxy(StreamAccessLogsMessage.Identifier identifier, HTTPAccessLogEntry entry) {
AccessLogCommon properties = entry.getCommonProperties();
if (properties != null) {
......@@ -330,6 +358,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
responseCode = response.getResponseCode().getValue();
}
boolean status = responseCode >= 200 && responseCode < 400;
String tlsMode = parseTLS(properties.getTlsProperties());
ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder()
.setStartTime(startTime)
......@@ -345,6 +374,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.setResponseCode(Math.toIntExact(responseCode))
.setStatus(status)
.setProtocol(protocol)
.setTlsMode(tlsMode)
.setDetectPoint(DetectPoint.server);
LOGGER.debug("Transformed ingress inbound mesh metric {}", metric);
......@@ -376,6 +406,9 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
Math.toIntExact(responseCode))
.setStatus(status)
.setProtocol(protocol)
// Can't parse it from tls properties, leave
// it to Server side.
.setTlsMode(NON_TLS)
.setDetectPoint(DetectPoint.client);
LOGGER.debug("Transformed ingress outbound mesh metric {}", outboundMetric);
......
......@@ -186,6 +186,7 @@ public class TelemetryDataDispatcher {
serviceRelation.setResponseCode(metrics.getResponseCode());
serviceRelation.setDetectPoint(detectPointMapping(metrics.getDetectPoint()));
serviceRelation.setComponentId(protocol2Component(metrics.getProtocol()));
serviceRelation.setTlsMode(metrics.getTlsMode());
SOURCE_RECEIVER.receive(serviceRelation);
}
......@@ -221,6 +222,7 @@ public class TelemetryDataDispatcher {
serviceRelation.setResponseCode(metrics.getResponseCode());
serviceRelation.setDetectPoint(detectPointMapping(metrics.getDetectPoint()));
serviceRelation.setComponentId(protocol2Component(metrics.getProtocol()));
serviceRelation.setTlsMode(metrics.getTlsMode());
SOURCE_RECEIVER.receive(serviceRelation);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册