This is an automated email from the ASF dual-hosted git repository.
liuhan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git
The following commit(s) were added to refs/heads/main by this push:
new 159e9cd Add Network profiling documentation (#49)
159e9cd is described below
commit 159e9cdc211bb3846c93e6fdb244a898ae86b9f6
Author: mrproliu <[email protected]>
AuthorDate: Mon Aug 29 17:43:15 2022 +0800
Add Network profiling documentation (#49)
---
docs/en/setup/configuration/profiling.md | 45 ++++++++++++++++++++++++++++++++
pkg/profiling/task/network/analyzer.go | 14 +++++-----
pkg/profiling/task/network/context.go | 6 ++---
pkg/profiling/task/network/metrics.go | 45 +++++++++++++++++++++++---------
pkg/profiling/task/network/runner.go | 2 +-
5 files changed, 89 insertions(+), 23 deletions(-)
diff --git a/docs/en/setup/configuration/profiling.md
b/docs/en/setup/configuration/profiling.md
index 8513b31..78d6fa6 100644
--- a/docs/en/setup/configuration/profiling.md
+++ b/docs/en/setup/configuration/profiling.md
@@ -39,6 +39,51 @@ Also, the following protocol are supported for analyzing
using OpenSSL library,
5. Kafka
6. DNS
+#### Metrics
+
+Network profiling uses metrics send data to the backend service.
+
+##### Data Type
+
+The network profiling has customized the following two types of metrics to
represent the network data:
+1. **Counter**: Records the total number of data in a certain period of time.
Each counter containers the following data:
+ 1. **Count**: The count of the execution.
+ 2. **Bytes**: The package size of the execution.
+ 3. **Exe Time**: The consumed time(nanosecond) of the execution.
+2. **Histogram**: Records the distribution of the data in the bucket.
+
+##### Labels
+
+Each metric contains the following labels to identify the process relationship:
+
+| Name | Type | Description |
+|------|------|-------------|
+|client_process_id or server_process_id| string | The ID of the current
process, which is determined by the role of the current process in the
connection as server or client. |
+|client_local or server_local| boolean | The remote process is a local
process. |
+|client_address or server_address| string | The remote process address. ex:
`IP:port`. |
+|side| enum | The current process is either "client" or "server" in this
connection. |
+|protocol| string | Identification the protocol based on the package data
content. |
+|is_ssl| bool | Is the current connection using SSL. |
+
+##### Data
+
+Based on the above two data types, the following metrics are provided.
+
+| Name | Type| Unit | Description |
+|------|-----|------|-------------|
+|write|Counter|nanosecond|The socket write counter|
+|read|Counter|nanosecond|The socket read counter|
+|write RTT|Counter|microsecond|The socket write RTT counter|
+|connect|Counter|nanosecond|The socket connect/accept with other server/client
counter|
+|close|Counter|nanosecond|The socket close counter|
+|retransmit|Counter|nanosecond|The socket retransmit package counter|
+|drop|Counter|nanosecond|The socket drop package counter|
+|write RTT|Histogram|microsecond|The socket write RTT execute time histogram|
+|write execute time|Histogram|nanosecond|The socket write data execute time
histogram|
+|read execute time|Histogram|nanosecond|The socket read data execute time
histogram|
+|connect execute time|Histogram|nanosecond|The socket connect/accept with
other server/client execute time histogram|
+|close execute time|Histogram|nanosecond|The socket close execute time
histogram|
+
## Configuration
| Name | Default | Environment Key | Description |
diff --git a/pkg/profiling/task/network/analyzer.go
b/pkg/profiling/task/network/analyzer.go
index 581da98..8eb69bc 100644
--- a/pkg/profiling/task/network/analyzer.go
+++ b/pkg/profiling/task/network/analyzer.go
@@ -179,11 +179,11 @@ func (t *TrafficAnalyzer)
generateOrCombineTraffic(traffic *ProcessTraffic, con
CloseCounter: NewSocketDataCounter(),
RetransmitCounter: NewSocketDataCounter(),
DropCounter: NewSocketDataCounter(),
- WriteRTTHistogram: NewSocketDataHistogram(),
- WriteExeTimeHistogram: NewSocketDataHistogram(),
- ReadExeTimeHistogram: NewSocketDataHistogram(),
- ConnectExeTimeHistogram: NewSocketDataHistogram(),
- CloseExeTimeHistogram: NewSocketDataHistogram(),
+ WriteRTTHistogram:
NewSocketDataHistogram(HistogramDataUnitUS),
+ WriteExeTimeHistogram:
NewSocketDataHistogram(HistogramDataUnitNS),
+ ReadExeTimeHistogram:
NewSocketDataHistogram(HistogramDataUnitNS),
+ ConnectExeTimeHistogram:
NewSocketDataHistogram(HistogramDataUnitNS),
+ CloseExeTimeHistogram:
NewSocketDataHistogram(HistogramDataUnitNS),
}
}
if len(traffic.LocalProcesses) == 0 && len(con.LocalProcesses) > 0 {
@@ -401,8 +401,8 @@ func (t *TrafficAnalyzer)
findRemotePidWhenMeshEnvironment(con *ConnectionContex
}
continue
}
- // if current is mesh application, and remote address is not
local and dns, them it's must be sent to the MESH_DP
- if localProcess.Entity().Layer == layerMeshApp &&
con.RemotePort != 53 &&
+ // if current is mesh application, them it's must be sent to
the MESH_DP
+ if localProcess.Entity().Layer == layerMeshApp &&
len(t.localAddresses[con.RemoteIP]) == 0 &&
!tools.IsLocalHostAddress(con.RemoteIP) {
if envoyPid :=
t.findSameInstanceMeshDP(localProcess.Entity()); envoyPid != 0 {
log.Debugf("found in the mesh data plane,
remote ip: %s", con.RemoteIP)
diff --git a/pkg/profiling/task/network/context.go
b/pkg/profiling/task/network/context.go
index 644d220..42e7364 100644
--- a/pkg/profiling/task/network/context.go
+++ b/pkg/profiling/task/network/context.go
@@ -535,9 +535,9 @@ func (c *Context) newConnectionContext(conID, randomID
uint64, pid, fd uint32, p
WriteCounter: NewSocketDataCounterWithHistory(),
ReadCounter: NewSocketDataCounterWithHistory(),
WriteRTTCounter: NewSocketDataCounterWithHistory(),
- WriteRTTHistogram: NewSocketDataHistogramWithHistory(),
- WriteExeTimeHistogram: NewSocketDataHistogramWithHistory(),
- ReadExeTimeHistogram: NewSocketDataHistogramWithHistory(),
+ WriteRTTHistogram:
NewSocketDataHistogramWithHistory(HistogramDataUnitUS),
+ WriteExeTimeHistogram:
NewSocketDataHistogramWithHistory(HistogramDataUnitNS),
+ ReadExeTimeHistogram:
NewSocketDataHistogramWithHistory(HistogramDataUnitNS),
}
}
diff --git a/pkg/profiling/task/network/metrics.go
b/pkg/profiling/task/network/metrics.go
index 388be01..a52d5e3 100644
--- a/pkg/profiling/task/network/metrics.go
+++ b/pkg/profiling/task/network/metrics.go
@@ -81,17 +81,24 @@ func (c *SocketDataCounterWithHistory) CalculateIncrease()
*SocketDataCounter {
}
}
-// SocketHistogramBuckets means the histogram bucket: 0ms, 0.01ms, 0.05ms,
0.1ms, 0.5ms, 1ms, 1.2ms, 1.5ms, 1.7ms, 2ms,
+// SocketHistogramBucketsNs means the histogram bucket: 0ms, 0.01ms, 0.05ms,
0.1ms, 0.5ms, 1ms, 1.2ms, 1.5ms, 1.7ms, 2ms,
// 2.5ms, 3ms, 5ms, 7ms, 10ms, 13ms, 16ms, 20ms, 25ms, 30ms, 35ms, 40ms, 45ms,
50ms, 70ms, 100ms, 150ms,
// 200ms, 300ms, 500ms, 1s, 2s, 3s, 5s
-// value unit: us
-var SocketHistogramBuckets = []float64{0, 10, 50, 100, 500, 1000, 1200, 1500,
1700, 2000,
+// value unit: ns
+var SocketHistogramBucketsNs = []float64{0, 10000, 50000, 100000, 500000,
1000000, 1200000, 1500000, 1700000, 2000000,
+ 2500000, 3000000, 5000000, 7000000, 10000000, 13000000, 16000000,
20000000, 25000000, 30000000, 35000000, 40000000,
+ 45000000, 50000000, 70000000, 100000000, 150000000, 200000000,
300000000, 500000000, 1000000000, 2000000000,
+ 3000000000, 5000000000}
+
+// SocketHistogramBucketsUs same with SocketHistogramBucketsNs, but the value
unit: us
+var SocketHistogramBucketsUs = []float64{0, 10, 50, 100, 500, 1000, 1200,
1500, 1700, 2000,
2500, 3000, 5000, 7000, 10000, 13000, 16000, 20000, 25000, 30000,
35000, 40000,
45000, 50000, 70000, 100000, 150000, 200000, 300000, 500000, 1000000,
2000000,
3000000, 5000000}
-var SocketHistogramBucketsCount = len(SocketHistogramBuckets)
+var SocketHistogramBucketsCount = len(SocketHistogramBucketsNs)
type SocketDataHistogram struct {
+ Unit HistogramDataUnit
Buckets map[uint64]uint32
}
@@ -113,13 +120,13 @@ func (h *SocketDataHistogram) Increase(other
*SocketDataHistogram) {
func (h *SocketDataHistogram) IncreaseByValue(val uint64) {
floatVal := float64(val)
- for inx, curVal := range SocketHistogramBuckets {
+ for inx, curVal := range SocketHistogramBucketsNs {
if inx > 0 && curVal > floatVal {
h.Buckets[uint64(inx-1)]++
return
}
}
- h.Buckets[uint64(len(SocketHistogramBuckets)-1)]++
+ h.Buckets[uint64(len(SocketHistogramBucketsNs)-1)]++
}
func (h *SocketDataHistogram) NotEmpty() bool {
@@ -131,25 +138,33 @@ func (h *SocketDataHistogram) NotEmpty() bool {
return false
}
-func NewSocketDataHistogram() *SocketDataHistogram {
+func NewSocketDataHistogram(unit HistogramDataUnit) *SocketDataHistogram {
buckets := make(map[uint64]uint32, SocketHistogramBucketsCount)
for i := 0; i < SocketHistogramBucketsCount; i++ {
buckets[uint64(i)] = 0
}
return &SocketDataHistogram{
+ Unit: unit,
Buckets: buckets,
}
}
+type HistogramDataUnit int
+
+const (
+ HistogramDataUnitNS HistogramDataUnit = 1
+ HistogramDataUnitUS HistogramDataUnit = 2
+)
+
type SocketDataHistogramWithHistory struct {
Pre *SocketDataHistogram
Cur *SocketDataHistogram
}
-func NewSocketDataHistogramWithHistory() *SocketDataHistogramWithHistory {
+func NewSocketDataHistogramWithHistory(unit HistogramDataUnit)
*SocketDataHistogramWithHistory {
return &SocketDataHistogramWithHistory{
- Pre: NewSocketDataHistogram(),
- Cur: NewSocketDataHistogram(),
+ Pre: NewSocketDataHistogram(unit),
+ Cur: NewSocketDataHistogram(unit),
}
}
@@ -163,7 +178,7 @@ func (h *SocketDataHistogramWithHistory)
UpdateToCurrent(bucket uint64, val uint
}
func (h *SocketDataHistogramWithHistory) CalculateIncrease()
*SocketDataHistogram {
- histogram := NewSocketDataHistogram()
+ histogram := NewSocketDataHistogram(h.Cur.Unit)
var increaseVal uint32
for curK, curV := range h.Cur.Buckets {
if increaseVal = curV - h.Pre.Buckets[curK]; increaseVal > 0 {
@@ -298,8 +313,14 @@ func (r *ProcessTraffic) appendHistogramValue(metrics
[]*v3.MeterData, metricsPr
if bucketInx >= SocketHistogramBucketsCount {
bucketInx = SocketHistogramBucketsCount - 1
}
+ var buckets []float64
+ if histogram.Unit == HistogramDataUnitUS {
+ buckets = SocketHistogramBucketsUs
+ } else {
+ buckets = SocketHistogramBucketsNs
+ }
values = append(values, &v3.MeterBucketValue{
- Bucket: SocketHistogramBuckets[bucketInx],
+ Bucket: buckets[bucketInx],
Count: int64(count),
})
}
diff --git a/pkg/profiling/task/network/runner.go
b/pkg/profiling/task/network/runner.go
index f085ffd..c623bfd 100644
--- a/pkg/profiling/task/network/runner.go
+++ b/pkg/profiling/task/network/runner.go
@@ -237,7 +237,7 @@ func (r *Runner) logTheMetricsConnections(traffices
[]*ProcessTraffic) {
traffic.RemoteIP, traffic.RemotePort,
traffic.RemotePid)
}
side := traffic.ConnectionRole.String()
- log.Debugf("connection analyze result: %s : %s -> %s, protocol:
%s, is SSL: %t, read: %d bytes/%d, write: %d bytes/%d",
+ log.Debugf("connection analyze result: %s : %s -> %s, protocol:
%s, is SSL: %t, write: %d bytes/%d, read: %d bytes/%d",
side, localInfo, remoteInfo, traffic.Protocol.String(),
traffic.IsSSL, traffic.WriteCounter.Bytes, traffic.WriteCounter.Count,
traffic.ReadCounter.Bytes, traffic.ReadCounter.Count)
}