blob: 324094b3172119cc6db967bb9e30d9fd9623d3db [file] [log] [blame]
/*
* 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.
*
*/
syntax = "proto3";
package skywalking.v3;
option java_multiple_files = true;
option java_package = "org.apache.skywalking.apm.network.ebpf.accesslog.v3";
option go_package = "skywalking.apache.org/repo/goapi/collect/ebpf/accesslog/v3";
import "common/Common.proto";
service EBPFAccessLogService {
rpc collect(stream EBPFAccessLogMessage) returns (EBPFAccessLogDownstream) {
}
}
message EBPFAccessLogMessage {
// current node information, only not null when first message or have update
EBPFAccessLogNodeInfo node = 1;
// local process and remote process connection information
AccessLogConnection connection = 2;
// kernel level metrics
repeated AccessLogKernelLog kernelLogs = 3;
// application protocol log
// if the protocol is detected, the kernel logs is works the related logs
// otherwise, the kernel log is not related and is sent periodically
AccessLogProtocolLogs protocolLog = 4;
}
message EBPFAccessLogNodeInfo {
// Node name
string name = 1;
// All net interfaces list
repeated EBPFAccessLogNodeNetInterface netInterfaces = 2;
// System boot time
Instant bootTime = 3;
// Cluster name
string clusterName = 4;
}
message EBPFAccessLogNodeNetInterface {
int32 index = 1;
int32 mtu = 2;
string name = 3;
}
// Connection information
message AccessLogConnection {
// local address
ConnectionAddress local = 1;
// remote/peer address
ConnectionAddress remote = 2;
// local address detect point
DetectPoint role = 3;
// is the connection using TLS or not
AccessLogConnectionTLSMode tlsMode = 4;
// application protocol type
AccessLogProtocolType protocol = 5;
}
message ConnectionAddress {
oneof address {
// if the address is monitored under the local machine, then return the kubernetes
KubernetesProcessAddress kubernetes = 1;
// if the address cannot be aware, then return the ip address
IPAddress ip = 2;
}
}
message KubernetesProcessAddress {
string serviceName = 1;
string podName = 2;
string containerName = 3;
string processName = 4;
int32 port = 5;
}
message IPAddress {
string host = 1;
int32 port = 2;
}
enum AccessLogConnectionTLSMode {
Plain = 0;
TLS = 1;
}
message AccessLogKernelLog {
oneof operation {
AccessLogKernelConnectOperation connect = 1;
AccessLogKernelAcceptOperation accept = 2;
AccessLogKernelCloseOperation close = 3;
AccessLogKernelReadOperation read = 4;
AccessLogKernelWriteOperation write = 5;
}
}
message AccessLogProtocolLogs {
oneof protocol {
AccessLogHTTPProtocol http = 1;
}
}
message AccessLogHTTPProtocol {
// first bytes receive/write timestamp
EBPFTimestamp startTime = 1;
// last bytes receive/write timestamp
EBPFTimestamp endTime = 2;
AccessLogHTTPProtocolVersion version = 3;
AccessLogHTTPProtocolRequest request = 4;
AccessLogHTTPProtocolResponse response = 5;
}
enum AccessLogHTTPProtocolVersion {
HTTP1 = 0;
HTTP2 = 1;
}
message AccessLogHTTPProtocolRequest {
AccessLogHTTPProtocolRequestMethod method = 1;
// The path portion from the incoming request URI.
string path = 2;
// Request header and body size.
uint64 sizeOfHeadersBytes = 3;
uint64 sizeOfBodyBytes = 4;
// The trace information if detected.
AccessLogTraceInfo trace = 5;
}
message AccessLogHTTPProtocolResponse {
int32 statusCode = 1;
// Response header and body size.
uint64 sizeOfHeadersBytes = 3;
uint64 sizeOfBodyBytes = 4;
}
message AccessLogTraceInfo {
AccessLogTraceInfoProvider provider = 1;
// [Optional] A string id represents the whole trace.
string traceId = 2;
// A unique id represents this segment. Other segments could use this id to reference as a child segment.
// [Optional] when this span reference
string traceSegmentId = 3;
// If type == SkyWalking
// The number id of the span. Should be unique in the whole segment.
// Starting at 0
//
// If type == Zipkin
// The type of span ID is string.
string spanId = 4;
}
enum AccessLogTraceInfoProvider {
Zipkin = 0;
SkyWalking = 1;
}
enum AccessLogHTTPProtocolRequestMethod {
Get = 0;
Post = 1;
Put = 2;
Delete = 3;
Head = 4;
Patch = 5;
Options = 6;
Trace = 7;
Connect = 8;
}
message AccessLogKernelConnectOperation {
// Starting to connect with peer address timestamp
EBPFTimestamp startTime = 1;
// Finish connect operation timestamp
EBPFTimestamp endTime = 2;
// Is the connect operation success or not
bool success = 3;
}
message AccessLogKernelAcceptOperation {
// Starting to accept socket timestamp
EBPFTimestamp startTime = 1;
// Finish accept operation timestamp
EBPFTimestamp endTime = 2;
}
message AccessLogKernelCloseOperation {
// Starting to close the connection timestamp
EBPFTimestamp startTime = 1;
// Finish close operation timestamp
EBPFTimestamp endTime = 2;
// Is the close operation success or not
bool success = 3;
}
message AccessLogKernelWriteOperation {
// Starting to write data timestamp
EBPFTimestamp startTime = 1;
// Finish write operation timestamp
EBPFTimestamp endTime = 2;
// Which kind of syscall of current write operation
AccessLogKernelWriteSyscall syscall = 3;
// Layer 2-4 related metrics
AccessLogKernelWriteL4Metrics l4Metrics = 4;
AccessLogKernelWriteL3Metrics l3Metrics = 5;
AccessLogKernelWriteL2Metrics l2Metrics = 6;
}
message AccessLogKernelWriteL4Metrics {
// total duration(nanosecond) of layer 4
uint64 totalDuration = 1;
// total send package(contains retransmit count) count(sk_buff in linux)
int64 totalTransmitPackageCount = 2;
// total retransmit package count(sk_buff in linux)
int64 totalRetransmitPackageCount = 3;
// total losted package count metrics
repeated AccessLogLossPackageMetrics lossPackageMetrics = 4;
// total package size(bytes)
int64 totalPackageSize = 5;
}
message AccessLogLossPackageMetrics {
string location = 1;
int32 count = 2;
}
message AccessLogKernelWriteL3Metrics {
// total duration(nanosecond) of layer 3
uint64 totalDuration = 1;
// total local out use duration(nanoseconds) -> kernel: ip_local_out
uint64 totalLocalDuration = 2;
// total output use duration(nanoseconds) -> kernel: ip_finish_output2 - ip_output
uint64 totalOutputDuration = 3;
// total resolve remote MAC address(ARP Request) count and duration(nanosecond) -> kernel: neigh_resolve_output
uint64 totalResolveMACCount = 5;
uint64 totalResolveMACDuration = 6;
// total netfiltering count and duration(nanosecond) -> kernel: nf_hook
uint64 totalNetFilterCount = 7;
uint64 totalNetFilterDuration = 8;
}
message AccessLogKernelWriteL2Metrics {
// total duration(nanosecond) of layer 2
uint64 totalDuration = 1;
// target network hardware interface index, get the net hardware name through EBPFAccessLogNodeNetInterface#index
uint32 ifindex = 2;
// total enter the net device buffer count
uint64 totalEnterQueueBufferCount = 3;
// total buffer data ready to send duration(nanosecond), ready_to_send - enter_queue
uint64 totalReadySendDuration = 4;
// total send buffer to the net device duration(nanosecond)
uint64 totalNetDeviceSendDuration = 5;
}
message AccessLogKernelReadOperation {
// Starting to read data timestamp
EBPFTimestamp startTime = 1;
// Finish read operation timestamp
EBPFTimestamp endTime = 2;
// Which kind of syscall of current read operation
AccessLogKernelReadSyscall syscall = 3;
// Layer 2-4 related metrics
AccessLogKernelReadL2Metrics l2Metrics = 4;
AccessLogKernelReadL3Metrics l3Metrics = 5;
AccessLogKernelReadL4Metrics l4Metrics = 6;
}
message AccessLogKernelReadL2Metrics {
// from network hardware interface index, get the net hardware name through EBPFAccessLogNodeNetInterface#index
uint32 ifindex = 1;
// total package count
uint32 totalPackageCount = 2;
// total package size
uint64 totalPackageSize = 3;
// total duration(nanosecond) of all data packets queued (waiting to be read).
uint64 totalPackageToQueueDuration = 4;
// total duration(nanosecond) of all data packets read from the queue.
uint64 totalRcvPackageFromQueueDuration = 5;
}
message AccessLogKernelReadL3Metrics {
uint64 totalDuration = 1;
// total local receive use duration(nanoseconds) -> kernel: ip_rcv_finish - ip_rcv
uint64 totalRecvDuration = 2;
// total local use duration(nanoseconds) -> kernel: ip_local_deliver_finish - ip_local_deliver
uint64 totalLocalDuration = 3;
// total netfiltering count and duration(nanosecond) -> kernel: nf_hook
uint64 totalNetFilterCount = 4;
uint64 totalNetFilterDuration = 5;
}
message AccessLogKernelReadL4Metrics {
uint64 totalDuration = 1;
}
enum AccessLogKernelWriteSyscall {
Write = 0;
Writev = 1;
Send = 2;
SendTo = 3;
SendMsg = 4;
SendMmsg = 5;
SendFile = 6;
SendFile64 = 7;
}
enum AccessLogKernelReadSyscall {
Read = 0;
Readv = 1;
Recv = 2;
RecvFrom = 3;
RecvMsg = 4;
RecvMmsg = 5;
}
enum AccessLogProtocolType {
TCP = 0;
HTTP_1 = 1;
HTTP_2 = 2;
}
message EBPFTimestamp {
oneof timestamp {
EBPFOffsetTimestamp offset = 1;
}
}
// Get nanosecond through offset with node start instant
message EBPFOffsetTimestamp {
uint64 offset = 1;
}
message EBPFAccessLogDownstream {
}