This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/skywalking-data-collect-protocol.git
The following commit(s) were added to refs/heads/master by this push:
new 577656b Add more comments for the protocol.
577656b is described below
commit 577656bc52aaf0471c9f241c6a19b337937827df
Author: Wu Sheng <[email protected]>
AuthorDate: Wed Aug 5 17:08:56 2020 +0800
Add more comments for the protocol.
---
language-agent/JVMMetric.proto | 1 +
language-agent/Tracing.proto | 106 ++++++++++++++++++++++++++++++++++
management/Management.proto | 5 ++
service-mesh-probe/service-mesh.proto | 5 ++
4 files changed, 117 insertions(+)
diff --git a/language-agent/JVMMetric.proto b/language-agent/JVMMetric.proto
index cf3587d..0de1477 100644
--- a/language-agent/JVMMetric.proto
+++ b/language-agent/JVMMetric.proto
@@ -25,6 +25,7 @@ option go_package = "skywalking/network/language/agent/v3";
import "common/Common.proto";
+// Define the JVM metrics report service.
service JVMMetricReportService {
rpc collect (JVMMetricCollection) returns (Commands) {
}
diff --git a/language-agent/Tracing.proto b/language-agent/Tracing.proto
index 9ff9587..a8142b3 100644
--- a/language-agent/Tracing.proto
+++ b/language-agent/Tracing.proto
@@ -25,73 +25,179 @@ option go_package = "skywalking/network/language/agent/v3";
import "common/Common.proto";
+// Define a trace segment report service.
+// All language agents or any trace collecting component, could use this
service to send span collection to the SkyWalking OAP backend.
service TraceSegmentReportService {
rpc collect (stream SegmentObject) returns (Commands) {
}
}
+// The segment is a collection of spans. It includes all collected spans in a
simple one request context, such as a HTTP request process.
+//
+// We recommend the agent/SDK report all tracked data of one request once for
all, such as,
+// typically, such as in Java, one segment represent all tracked
operations(spans) of one request context in the same thread.
+// At the same time, in some language there is not a clear concept like
golang, it could represent all tracked operations of one request context.
message SegmentObject {
+ // A string id represents the whole trace.
string traceId = 1;
+ // A unique id represents this segment. Other segments could use this id
to reference as a child segment.
string traceSegmentId = 2;
+ // Span collections included in this segment.
repeated SpanObject spans = 3;
+ // **Service**. Represents a set/group of workloads which provide the same
behaviours for incoming requests.
+ //
+ // The logic name represents the service. This would show as a separate
node in the topology.
+ // The metrics analyzed from the spans, would be aggregated for this
entity as the service level.
string service = 4;
+ // **Service Instance**. Each individual workload in the Service group is
known as an instance. Like `pods` in Kubernetes, it
+ // doesn't need to be a single OS process, however, if you are using
instrument agents, an instance is actually a real OS process.
+ //
+ // The logic name represents the service instance. This would show as a
separate node in the instance relationship.
+ // The metrics analyzed from the spans, would be aggregated for this
entity as the service instance level.
string serviceInstance = 5;
+ // Whether the segment includes all tracked spans.
+ // In the production environment tracked, some tasks could include too
many spans for one request context, such as a batch update for a cache, or an
async job.
+ // The agent/SDK could optimize or ignore some tracked spans for better
performance.
+ // In this case, the value should be flagged as TRUE.
bool isSizeLimited = 6;
}
+// Segment reference represents the link between two existing segment.
message SegmentReference {
+ // Represent the reference type. It could be across thread or across
process.
+ // Across process means there is a downstream RPC call for this.
+ // Typically, refType == CrossProcess means SpanObject#spanType = entry.
RefType refType = 1;
+ // A string id represents the whole trace.
string traceId = 2;
+ // Another segment id as the parent.
string parentTraceSegmentId = 3;
+ // The span id in the parent trace segment.
int32 parentSpanId = 4;
+ // The service logic name of the parent segment.
+ // If refType == CrossThread, this name is as same as the trace segment.
string parentService = 5;
+ // The service logic name instance of the parent segment.
+ // If refType == CrossThread, this name is as same as the trace segment.
string parentServiceInstance = 6;
+ // The endpoint name of the parent segment.
+ // **Endpoint**. A path in a service for incoming requests, such as an
HTTP URI path or a gRPC service class + method signature.
+ // In a trace segment, the endpoint name is the name of first entry span.
string parentEndpoint = 7;
+ // The network address, including ip/hostname and port, which is used in
the client side.
+ // Such as Client --> use 127.0.11.8:913 -> Server
+ // then, in the reference of entry span reported by Server, the value of
this field is 127.0.11.8:913.
+ // This plays the important role in the SkyWalking STAM(Streaming Topology
Analysis Method)
+ // For more details, read https://wu-sheng.github.io/STAM/
string networkAddressUsedAtPeer = 8;
}
+// Span represents a execution unit in the system, with duration and many
other attributes.
+// Span could be a method, a RPC, MQ message produce or consume.
+// In the practice, the span should be added when it is really necessary, to
avoid payload overhead.
+// We recommend to creating spans in across process(client/server of RPC/MQ)
and across thread cases only.
message SpanObject {
+ // The number id of the span. Should be unique in the whole segment.
+ // Starting at 0.
int32 spanId = 1;
+ // The number id of the parent span in the whole segment.
+ // -1 represents no parent span.
+ // Also, be known as the root/first span of the segment.
int32 parentSpanId = 2;
+ // Start timestamp in milliseconds of this span,
+ // measured between the current time and midnight, January 1, 1970 UTC.
int64 startTime = 3;
+ // End timestamp in milliseconds of this span,
+ // measured between the current time and midnight, January 1, 1970 UTC.
int64 endTime = 4;
+ // <Optional>
+ // In the across thread and across process, these references targeting the
parent segments.
+ // The references usually have only one element, but in batch consumer
case, such as in MQ or async batch process, it could be multiple.
repeated SegmentReference refs = 5;
+ // A logic name represents this span.
+ //
+ // We don't recommend to include the parameter, such as HTTP request
parameters, as a part of the operation, especially this is the name of the
entry span.
+ // All statistic for the endpoints are aggregated base on this name. Those
parameters should be added in the tags if necessary.
+ // If in some cases, it have to be a part of the operation name,
+ // users should use the Group Parameterized Endpoints capability at the
backend to get the meaningful metrics.
+ // Read
https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/endpoint-grouping-rules.md
string operationName = 6;
+ // Remote address of the peer in RPC/MQ case.
+ // This is required when spanType = Exit, as it is a part of the
SkyWalking STAM(Streaming Topology Analysis Method).
+ // For more details, read https://wu-sheng.github.io/STAM/
string peer = 7;
+ // Span type represents the role in the RPC context.
SpanType spanType = 8;
+ // Span layer represent the component tech stack, related to the network
tech.
SpanLayer spanLayer = 9;
+ // Component id is a predefinited number id in the SkyWalking.
+ // It represents the framework, tech stack used by this tracked span, such
as Spring.
+ // All IDs are defined in the
https://github.com/apache/skywalking/blob/master/oap-server/server-bootstrap/src/main/resources/component-libraries.yml
+ // Send a pull request if you want to add languages, components or mapping
defintions,
+ // all public components could be accepted.
+ // Follow this doc for more details,
https://github.com/apache/skywalking/blob/master/docs/en/guides/Component-library-settings.md
int32 componentId = 10;
+ // The status of the span. False means the tracked execution ends in the
unexpected status.
+ // This affects the successful rate statistic in the backend.
+ // Exception or error code happened in the tracked process doesn't mean
isError == true, the implementations of agent plugin and tracing SDK make the
final decision.
bool isError = 11;
+ // String key, String value pair.
+ // Tags provides more informance, includes parameters.
repeated KeyStringValuePair tags = 12;
+ // String key, String value pair with an accurate timestamp.
+ // Logging some events happening in the context of the span duration.
repeated Log logs = 13;
+ // Force the backend don't do analysis, if the value is TRUE.
+ // The backend has its own configurations to follow or override this.
+ //
+ // Use this mostly because the agent/SDK could know more context of the
service role.
bool skipAnalysis = 14;
}
message Log {
+ // The timestamp in milliseconds of this event.,
+ // measured between the current time and midnight, January 1, 1970 UTC.
int64 time = 1;
+ // String key, String value pair.
repeated KeyStringValuePair data = 2;
}
+// Map to the type of span
enum SpanType {
+ // Server side of RPC. Consumer side of MQ.
Entry = 0;
+ // Client side of RPC. Producer side of MQ.
Exit = 1;
+ // A common local code execution.
Local = 2;
}
+// A ID could be represented by multiple string sections.
message ID {
repeated string id = 1;
}
+// Type of the reference
enum RefType {
+ // Map to the reference targeting the segment in another OS process.
CrossProcess = 0;
+ // Map to the reference targeting the segment in the same process of the
current one, just across thread.
+ // This is only used when the coding language has the thread concept.
CrossThread = 1;
}
+// Map to the layer of span
enum SpanLayer {
+ // Unknown layer. Could be anything.
Unknown = 0;
+ // A database layer, used in tracing the database client component.
Database = 1;
+ // A RPC layer, used in both client and server sides of RPC component.
RPCFramework = 2;
+ // HTTP is a more specific RPCFramework.
Http = 3;
+ // A MQ layer, used in both producer and consuer sides of the MQ component.
MQ = 4;
+ // A cache layer, used in tracing the cache client component.
Cache = 5;
}
\ No newline at end of file
diff --git a/management/Management.proto b/management/Management.proto
index be61478..9589ba4 100644
--- a/management/Management.proto
+++ b/management/Management.proto
@@ -25,10 +25,15 @@ option go_package = "skywalking/network/management/v3";
import "common/Common.proto";
+// Define the service reporting the extra information of the instance.
service ManagementService {
+ // Report custom properties of a service instance.
rpc reportInstanceProperties (InstanceProperties) returns (Commands) {
}
+ // Keep the instance alive in the backend analysis.
+ // Only recommend to do separate keepAlive report when no trace and
metrics needs to be reported.
+ // Otherwise, it is duplicated.
rpc keepAlive (InstancePingPkg) returns (Commands) {
}
diff --git a/service-mesh-probe/service-mesh.proto
b/service-mesh-probe/service-mesh.proto
index 4cdc18f..b54ff95 100644
--- a/service-mesh-probe/service-mesh.proto
+++ b/service-mesh-probe/service-mesh.proto
@@ -25,13 +25,18 @@ option go_package = "skywalking/network/servicemesh/v3";
import "common/Common.proto";
+// Define metrics report service. The metrics format is typically representing
the data model collected in the service mesh case.
service ServiceMeshMetricService {
rpc collect(stream ServiceMeshMetric) returns (MeshProbeDownstream) {
}
}
message ServiceMeshMetric {
+ // Start timestamp in milliseconds of this RPC,
+ // measured between the current time and midnight, January 1, 1970 UTC.
int64 startTime = 1;
+ // End timestamp in milliseconds of this RPC,
+ // measured between the current time and midnight, January 1, 1970 UTC.
int64 endTime = 2;
string sourceServiceName = 3;
string sourceServiceInstance = 4;