diff --git a/apm-protocol/apm-network/src/main/proto b/apm-protocol/apm-network/src/main/proto index 33b132bffaabacbd003eec41b498d2810f386161..75c74186a1548657013a299f388e6e8b7b4b5251 160000 --- a/apm-protocol/apm-network/src/main/proto +++ b/apm-protocol/apm-network/src/main/proto @@ -1 +1 @@ -Subproject commit 33b132bffaabacbd003eec41b498d2810f386161 +Subproject commit 75c74186a1548657013a299f388e6e8b7b4b5251 diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandler.java b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..cb372c512cecff7fa6580479dd1694eba69452ba --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandler.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.oap.server.receiver.istio.telemetry.provider; + +import com.google.protobuf.Timestamp; +import io.grpc.stub.StreamObserver; +import io.istio.HandleMetricServiceGrpc; +import io.istio.IstioMetricProto; +import io.istio.api.mixer.adapter.model.v1beta1.ReportProto; +import io.istio.api.policy.v1beta1.TypeProto; +import java.time.Duration; +import java.time.Instant; +import java.util.Map; +import org.apache.skywalking.apm.network.servicemesh.DetectPoint; +import org.apache.skywalking.apm.network.servicemesh.Protocol; +import org.apache.skywalking.apm.network.servicemesh.ServiceMeshMetric; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Handle istio telemetry data. + * + * @author gaohongtao + */ +public class IstioTelemetryGRPCHandler extends HandleMetricServiceGrpc.HandleMetricServiceImplBase { + + private static final Logger logger = LoggerFactory.getLogger(IstioTelemetryGRPCHandler.class); + + @Override public void handleMetric(IstioMetricProto.HandleMetricRequest request, + StreamObserver responseObserver) { + for (IstioMetricProto.InstanceMsg i : request.getInstancesList()) { + logger.debug("Received msg {}", request); + String requestMethod = string(i, "requestMethod"); + String requestPath = string(i,"requestPath"); + String requestScheme = string(i,"requestScheme"); + long responseCode = int64(i, "responseCode"); + String reporter = string(i, "reporter"); + String protocol = string(i, "apiProtocol"); + + String endpoint; + boolean status = true; + Protocol netProtocol; + if (protocol.equals("http") || protocol.equals("https")) { + endpoint = requestScheme + "/" + requestMethod + "/" + requestPath; + status = responseCode >= 200 && responseCode < 400; + netProtocol = Protocol.HTTP; + } else { + //grpc + endpoint = protocol + "/" + requestPath; + netProtocol = Protocol.gRPC; + } + Instant requestTime = time(i, "requestTime"); + Instant responseTime = time(i, "responseTime"); + int latency = Math.toIntExact(Duration.between(requestTime, responseTime).toMillis()); + + DetectPoint detectPoint; + if (reporter.equals("source")) { + detectPoint = DetectPoint.client; + } else { + detectPoint = DetectPoint.server; + } + ServiceMeshMetric metric = ServiceMeshMetric.newBuilder().setStartTime(requestTime.toEpochMilli()) + .setEndTime(responseTime.toEpochMilli()).setSourceServiceName(string(i, "sourceService")) + .setSourceServiceInstance(string(i, "sourceUID")).setDestServiceName(string(i, "destinationService")) + .setDestServiceInstance(string(i, "destinationUID")).setEndpoint(endpoint).setLatency(latency) + .setResponseCode(Math.toIntExact(responseCode)).setStatus(status).setProtocol(netProtocol).setDetectPoint(detectPoint).build(); + logger.debug("Transformed metric {}", metric); + } + responseObserver.onNext(ReportProto.ReportResult.newBuilder().build()); + responseObserver.onCompleted(); + } + + private String string(final IstioMetricProto.InstanceMsg instanceMsg, final String key) { + Map map = instanceMsg.getDimensionsMap(); + assertDimension(map, key); + return map.get(key).getStringValue(); + } + + private long int64(final IstioMetricProto.InstanceMsg instanceMsg, final String key) { + Map map = instanceMsg.getDimensionsMap(); + assertDimension(map, key); + return map.get(key).getInt64Value(); + } + + private Instant time(final IstioMetricProto.InstanceMsg instanceMsg, final String key) { + Map map = instanceMsg.getDimensionsMap(); + assertDimension(map, key); + Timestamp timestamp = map.get(key).getTimestampValue().getValue(); + return Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos()); + } + + private void assertDimension(final Map map, final String key) { + if (!map.containsKey(key)) { + throw new IllegalArgumentException(String.format("Lack dimension %s", key)); + } + } +} diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java index ee03495fdbb6c8563f8e6b4476c0b3fdf0cdd40b..4421f2498f992b614ed8a357231d591c086785bb 100644 --- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java @@ -19,6 +19,7 @@ package org.apache.skywalking.oap.server.receiver.istio.telemetry.provider; import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister; import org.apache.skywalking.oap.server.library.module.ModuleConfig; import org.apache.skywalking.oap.server.library.module.ModuleDefine; import org.apache.skywalking.oap.server.library.module.ModuleProvider; @@ -43,6 +44,8 @@ public class IstioTelemetryReceiverProvider extends ModuleProvider { } @Override public void start() throws ServiceNotProvidedException, ModuleStartException { + GRPCHandlerRegister service = getManager().find(CoreModule.NAME).getService(GRPCHandlerRegister.class); + service.addHandler(new IstioTelemetryGRPCHandler()); } @Override public void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException { diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/istio-metric.proto b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/istio-metric.proto index f74fa1d8ed1a814e9c535e9ea9ae053b3ffc5f5a..082b482ca3b1c35319db0ed8176881c0f63e1cd6 100644 --- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/istio-metric.proto +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/istio-metric.proto @@ -54,6 +54,9 @@ import "mixer/adapter/model/v1beta1/report.proto"; import "policy/v1beta1/value_type.proto"; import "policy/v1beta1/type.proto"; +option java_package = "io.istio"; +option java_outer_classname = "IstioMetricProto"; + option (istio.mixer.adapter.model.v1beta1.template_variety) = TEMPLATE_VARIETY_REPORT; option (istio.mixer.adapter.model.v1beta1.template_name) = "metric"; diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/extensions.proto b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/extensions.proto index 5237ac9a7647263aeb768be78c49179506883dfc..297684351ab8b7fd9b2c42b45af9f137a18e741a 100644 --- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/extensions.proto +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/extensions.proto @@ -17,6 +17,8 @@ syntax = "proto3"; package istio.mixer.adapter.model.v1beta1; option go_package="istio.io/api/mixer/adapter/model/v1beta1"; +option java_package = "io.istio.api.mixer.adapter.model.v1beta1"; +option java_outer_classname = "ExtensionsProto"; import "google/protobuf/descriptor.proto"; diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/report.proto b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/report.proto index bc4bee86a4baf7d40ed7b08e6d1fe0a7952566f4..6fdcca3e1887be2c215994175ef7500043adac2b 100644 --- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/report.proto +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/mixer/adapter/model/v1beta1/report.proto @@ -17,6 +17,8 @@ syntax = "proto3"; package istio.mixer.adapter.model.v1beta1; option go_package="istio.io/api/mixer/adapter/model/v1beta1"; +option java_package = "io.istio.api.mixer.adapter.model.v1beta1"; +option java_outer_classname = "ReportProto"; import "gogoproto/gogo.proto"; diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/type.proto b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/type.proto index d6027d1ca4d1e6b11365e6b38f4c4bdb701e13f5..1b7505e892fd01ea770bf6db47aa20abaa2c6c53 100644 --- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/type.proto +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/type.proto @@ -22,6 +22,8 @@ syntax = "proto3"; package istio.policy.v1beta1; option go_package="istio.io/api/policy/v1beta1"; +option java_package = "io.istio.api.policy.v1beta1"; +option java_outer_classname = "TypeProto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/value_type.proto b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/value_type.proto index 23194f3a045b6d19f16e803d63832d52db41616c..04d8675ab96ec0537b7ced7d5a307d0e772dec7d 100644 --- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/value_type.proto +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/main/proto/policy/v1beta1/value_type.proto @@ -17,6 +17,8 @@ syntax = "proto3"; package istio.policy.v1beta1; option go_package="istio.io/api/policy/v1beta1"; +option java_package = "io.istio.api.policy.v1beta1"; +option java_outer_classname = "ValueTypeProto"; // ValueType describes the types that values in the Istio system can take. These // are used to describe the type of Attributes at run time, describe the type of diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/test/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandlerTest.java b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/test/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandlerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4199ac91cf708a1cad568d8cccfb5572d53ea165 --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/istio-telemetry-receiver-provider/src/test/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandlerTest.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.oap.server.receiver.istio.telemetry.provider; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class IstioTelemetryGRPCHandlerTest { + + @Test + public void handleMetric() { + } +} \ No newline at end of file diff --git a/oap-server/server-starter/src/main/resources/application.yml b/oap-server/server-starter/src/main/resources/application.yml index 46c35354c215c576ba628ddbd614badef3d809e1..0799415d8a6299cf7b43188b79b8ab1e612e6cc5 100644 --- a/oap-server/server-starter/src/main/resources/application.yml +++ b/oap-server/server-starter/src/main/resources/application.yml @@ -51,6 +51,8 @@ storage: monthMetricDataTTL: 18 # Unit is month service-mesh: default: +istio-telemetry: + default: query: graphql: path: /graphql diff --git a/oap-server/server-starter/src/main/resources/log4j2.xml b/oap-server/server-starter/src/main/resources/log4j2.xml index 0003b820bf52f4ef5862356ab50dffb02c53db5e..eb69a897dce06cd2bb9d3418f40354bff9c2abc2 100644 --- a/oap-server/server-starter/src/main/resources/log4j2.xml +++ b/oap-server/server-starter/src/main/resources/log4j2.xml @@ -28,6 +28,7 @@ +