Skip to content

Commit 75b5ded

Browse files
lzf575xiaochaoren1
authored andcommitted
feat: support pod service custom servie
1 parent 30946d0 commit 75b5ded

10 files changed

Lines changed: 104 additions & 27 deletions

File tree

server/ingester/app_log/decoder/decoder.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ func (d *Decoder) WriteAgentLog(agentId uint16, bs []byte) error {
278278
}
279279

280280
s.AutoInstanceID, s.AutoInstanceType = ingestercommon.GetAutoInstance(s.PodID, 0, s.PodNodeID, s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), s.L3EpcID)
281-
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0)
281+
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0, s.ServiceID, s.PodGroupID, s.L3DeviceID, uint8(s.L3DeviceType))
282282
s.AutoServiceID, s.AutoServiceType = ingestercommon.GetAutoService(customServiceID, s.ServiceID, s.PodGroupID, 0, s.PodNodeID, s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), podGroupType, s.L3EpcID)
283283
}
284284

@@ -448,7 +448,7 @@ func (d *Decoder) WriteAppLog(agentId uint16, l *AppLogEntry) error {
448448
}
449449

450450
s.AutoInstanceID, s.AutoInstanceType = ingestercommon.GetAutoInstance(s.PodID, 0, s.PodNodeID, s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), s.L3EpcID)
451-
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0)
451+
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0, s.ServiceID, s.PodGroupID, s.L3DeviceID, uint8(s.L3DeviceType))
452452
s.AutoServiceID, s.AutoServiceType = ingestercommon.GetAutoService(customServiceID, s.ServiceID, s.PodGroupID, 0, s.PodNodeID, s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), podGroupType, s.L3EpcID)
453453

454454
d.logWriter.Write(s)

server/ingester/event/decoder/decoder.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ func (d *Decoder) WriteFileEvent(vtapId uint16, e *pb.ProcEvent) {
253253
}
254254

255255
s.AutoInstanceID, s.AutoInstanceType = ingestercommon.GetAutoInstance(s.PodID, s.GProcessID, s.PodNodeID, s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), s.L3EpcID)
256-
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0)
256+
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0, s.ServiceID, s.PodGroupID, s.L3DeviceID, uint8(s.L3DeviceType))
257257
s.AutoServiceID, s.AutoServiceType = ingestercommon.GetAutoService(customServiceID, s.ServiceID, s.PodGroupID, s.GProcessID, uint32(s.PodClusterID), s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), podGroupType, s.L3EpcID)
258258

259259
s.AppInstance = strconv.Itoa(int(e.Pid))
@@ -406,7 +406,7 @@ func (d *Decoder) handleResourceEvent(event *eventapi.ResourceEvent) {
406406
s.ServiceID = d.platformData.QueryPodService(s.OrgId, s.PodID, s.PodNodeID, uint32(s.PodClusterID), s.PodGroupID, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0, 0)
407407
}
408408

409-
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0)
409+
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0, s.ServiceID, s.PodGroupID, s.L3DeviceID, uint8(s.L3DeviceType))
410410
s.AutoServiceID, s.AutoServiceType =
411411
ingestercommon.GetAutoService(
412412
customServiceID,

server/ingester/event/decoder/k8s_event.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (d *Decoder) WriteK8sEvent(vtapId uint16, e *pb.KubernetesEvent) {
112112
}
113113

114114
s.AutoInstanceID, s.AutoInstanceType = ingestercommon.GetAutoInstance(s.PodID, s.GProcessID, s.PodNodeID, s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), s.L3EpcID)
115-
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0)
115+
customServiceID := d.platformData.QueryCustomService(s.OrgId, s.L3EpcID, !s.IsIPv4, s.IP4, s.IP6, 0, s.ServiceID, s.PodGroupID, s.L3DeviceID, uint8(s.L3DeviceType))
116116
s.AutoServiceID, s.AutoServiceType = ingestercommon.GetAutoService(customServiceID, s.ServiceID, s.PodGroupID, s.GProcessID, uint32(s.PodClusterID), s.L3DeviceID, uint32(s.SubnetID), uint8(s.L3DeviceType), podGroupType, s.L3EpcID)
117117

118118
d.eventWriter.Write(s)

server/ingester/ext_metrics/decoder/decoder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ func (d *Decoder) fillExtMetricsBaseSlow(m *dbwriter.ExtMetrics, vtapID uint16,
344344
t.ServiceID = d.platformData.QueryPodService(m.OrgId, t.PodID, t.PodNodeID, uint32(t.PodClusterID), t.PodGroupID, t.L3EpcID, t.IsIPv6 == 1, t.IP, t.IP6, 0, 0)
345345
}
346346
t.AutoInstanceID, t.AutoInstanceType = common.GetAutoInstance(t.PodID, t.GPID, t.PodNodeID, t.L3DeviceID, uint32(t.SubnetID), uint8(t.L3DeviceType), t.L3EpcID)
347-
customServiceID := d.platformData.QueryCustomService(m.OrgId, t.L3EpcID, t.IsIPv6 == 1, t.IP, t.IP6, 0)
347+
customServiceID := d.platformData.QueryCustomService(m.OrgId, t.L3EpcID, t.IsIPv6 == 1, t.IP, t.IP6, 0, t.ServiceID, t.PodGroupID, t.L3DeviceID, uint8(t.L3DeviceType))
348348
t.AutoServiceID, t.AutoServiceType = common.GetAutoService(customServiceID, t.ServiceID, t.PodGroupID, t.GPID, uint32(t.PodClusterID), t.L3DeviceID, uint32(t.SubnetID), uint8(t.L3DeviceType), podGroupType, t.L3EpcID)
349349
}
350350
}

server/ingester/flow_log/log_data/l4_flow_log.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,11 +689,11 @@ func (k *KnowledgeGraph) fill(
689689
}
690690

691691
k.AutoInstanceID0, k.AutoInstanceType0 = common.GetAutoInstance(k.PodID0, gpID0, k.PodNodeID0, k.L3DeviceID0, uint32(k.SubnetID0), k.L3DeviceType0, k.L3EpcID0)
692-
customServiceID0 := platformData.QueryCustomService(k.OrgId, l3EpcID0, isIPv6, ip40, ip60, 0)
692+
customServiceID0 := platformData.QueryCustomService(k.OrgId, l3EpcID0, isIPv6, ip40, ip60, 0, k.ServiceID0, k.PodGroupID0, k.L3DeviceID0, k.L3DeviceType0)
693693
k.AutoServiceID0, k.AutoServiceType0 = common.GetAutoService(customServiceID0, k.ServiceID0, k.PodGroupID0, gpID0, uint32(k.PodClusterID0), k.L3DeviceID0, uint32(k.SubnetID0), k.L3DeviceType0, k.PodGroupType0, k.L3EpcID0)
694694

695695
k.AutoInstanceID1, k.AutoInstanceType1 = common.GetAutoInstance(k.PodID1, gpID1, k.PodNodeID1, k.L3DeviceID1, uint32(k.SubnetID1), k.L3DeviceType1, k.L3EpcID1)
696-
customServiceID1 := platformData.QueryCustomService(k.OrgId, l3EpcID1, isIPv6, ip41, ip61, port)
696+
customServiceID1 := platformData.QueryCustomService(k.OrgId, l3EpcID1, isIPv6, ip41, ip61, port, k.ServiceID1, k.PodGroupID1, k.L3DeviceID1, k.L3DeviceType1)
697697
k.AutoServiceID1, k.AutoServiceType1 = common.GetAutoService(customServiceID1, k.ServiceID1, k.PodGroupID1, gpID1, uint32(k.PodClusterID1), k.L3DeviceID1, uint32(k.SubnetID1), k.L3DeviceType1, k.PodGroupType1, k.L3EpcID1)
698698
}
699699

server/ingester/flow_metrics/unmarshaller/handle_document.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ func DocumentExpand(doc app.Document, platformData *grpc.PlatformInfoTable) erro
194194
}
195195
}
196196
t.AutoInstanceID1, t.AutoInstanceType1 = common.GetAutoInstance(t.PodID1, t.GPID1, t.PodNodeID1, t.L3DeviceID1, uint32(t.SubnetID1), uint8(t.L3DeviceType1), t.L3EpcID1)
197-
customSeriviceID1 := platformData.QueryCustomService(t.OrgId, t.L3EpcID1, t.IsIPv4 == 0, t.IP1, t.IP61, t.ServerPort)
197+
customSeriviceID1 := platformData.QueryCustomService(t.OrgId, t.L3EpcID1, t.IsIPv4 == 0, t.IP1, t.IP61, t.ServerPort, t.ServiceID1, t.PodGroupID1, t.L3DeviceID1, uint8(t.L3DeviceType1))
198198
t.AutoServiceID1, t.AutoServiceType1 = common.GetAutoService(customSeriviceID1, t.ServiceID1, t.PodGroupID1, t.GPID1, uint32(t.PodClusterID1), t.L3DeviceID1, uint32(t.SubnetID1), uint8(t.L3DeviceType1), podGroupType1, t.L3EpcID1)
199199

200200
if info != nil {
@@ -255,7 +255,7 @@ func DocumentExpand(doc app.Document, platformData *grpc.PlatformInfoTable) erro
255255
if t.Code&EdgeCode == 0 {
256256
serverPort = t.ServerPort
257257
}
258-
customServiceID := platformData.QueryCustomService(t.OrgId, t.L3EpcID, t.IsIPv4 == 0, t.IP, t.IP6, serverPort)
258+
customServiceID := platformData.QueryCustomService(t.OrgId, t.L3EpcID, t.IsIPv4 == 0, t.IP, t.IP6, serverPort, t.ServiceID, t.PodGroupID, t.L3DeviceID, uint8(t.L3DeviceType))
259259
t.AutoServiceID, t.AutoServiceType = common.GetAutoService(customServiceID, t.ServiceID, t.PodGroupID, t.GPID, uint32(t.PodClusterID), t.L3DeviceID, uint32(t.SubnetID), uint8(t.L3DeviceType), podGroupType, t.L3EpcID)
260260

261261
if t.SignalSource == SIGNAL_SOURCE_OTEL {

server/ingester/profile/dbwriter/profile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ func (p *InProcessProfile) fillResource(vtapID uint16, podID uint32, platformDat
387387
}
388388

389389
p.AutoInstanceID, p.AutoInstanceType = basecommon.GetAutoInstance(p.PodID, p.GPID, p.PodNodeID, p.L3DeviceID, uint32(p.SubnetID), p.L3DeviceType, p.L3EpcID)
390-
customServiceID := platformData.QueryCustomService(p.OrgId, p.L3EpcID, !p.IsIPv4, p.IP4, p.IP6, 0)
390+
customServiceID := platformData.QueryCustomService(p.OrgId, p.L3EpcID, !p.IsIPv4, p.IP4, p.IP6, 0, p.ServiceID, p.PodGroupID, p.L3DeviceID, p.L3DeviceType)
391391
p.AutoServiceID, p.AutoServiceType = basecommon.GetAutoService(customServiceID, p.ServiceID, p.PodGroupID, p.GPID, uint32(p.PodClusterID), p.L3DeviceID, uint32(p.SubnetID), p.L3DeviceType, podGroupType, p.L3EpcID)
392392

393393
}

server/ingester/prometheus/decoder/decoder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ func (b *PrometheusSamplesBuilder) fillUniversalTagSlow(m *dbwriter.PrometheusSa
580580
t.ServiceID = b.platformData.QueryPodService(m.OrgId, t.PodID, t.PodNodeID, uint32(t.PodClusterID), t.PodGroupID, t.L3EpcID, t.IsIPv6 == 1, t.IP, t.IP6, 0, 0)
581581
}
582582
t.AutoInstanceID, t.AutoInstanceType = common.GetAutoInstance(t.PodID, t.GPID, t.PodNodeID, t.L3DeviceID, uint32(t.SubnetID), uint8(t.L3DeviceType), t.L3EpcID)
583-
customServiceID := b.platformData.QueryCustomService(m.OrgId, t.L3EpcID, t.IsIPv6 == 1, t.IP, t.IP6, 0)
583+
customServiceID := b.platformData.QueryCustomService(m.OrgId, t.L3EpcID, t.IsIPv6 == 1, t.IP, t.IP6, 0, t.ServiceID, t.PodGroupID, t.L3DeviceID, uint8(t.L3DeviceType))
584584
t.AutoServiceID, t.AutoServiceType = common.GetAutoService(customServiceID, t.ServiceID, t.PodGroupID, t.GPID, uint32(t.PodClusterID), t.L3DeviceID, uint32(t.SubnetID), uint8(t.L3DeviceType), podGroupType, t.L3EpcID)
585585
}
586586
}

server/libs/grpc/grpc_platformdata.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,8 @@ func (t *PlatformInfoTable) QueryPodService(orgId uint16, podID, podNodeID, podC
385385
return t.ServiceTable[orgId].QueryPodService(podID, podNodeID, podClusterID, podGroupID, epcID, isIPv6, ipv4, ipv6, protocol, serverPort)
386386
}
387387

388-
func (t *PlatformInfoTable) QueryCustomService(orgId uint16, epcID int32, isIPv6 bool, ipv4 uint32, ipv6 net.IP, serverPort uint16) uint32 {
389-
return t.ServiceTable[orgId].QueryCustomService(epcID, isIPv6, ipv4, ipv6, serverPort)
388+
func (t *PlatformInfoTable) QueryCustomService(orgId uint16, epcID int32, isIPv6 bool, ipv4 uint32, ipv6 net.IP, serverPort uint16, podServiceId, podGroupId, l3DeviceId uint32, l3DeviceType uint8) uint32 {
389+
return t.ServiceTable[orgId].QueryCustomService(epcID, isIPv6, ipv4, ipv6, serverPort, podServiceId, podGroupId, l3DeviceId, l3DeviceType)
390390
}
391391

392392
func (t *PlatformInfoTable) QueryResourceInfo(orgId uint16, resourceType, resourceID, podID uint32) *Info {

server/libs/grpc/grpc_service.go

Lines changed: 90 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,21 @@ import (
2424
"strings"
2525

2626
"github.com/deepflowio/deepflow/message/trident"
27+
flow_metrics "github.com/deepflowio/deepflow/server/libs/flow-metrics"
2728
"github.com/deepflowio/deepflow/server/libs/utils"
2829
"github.com/google/gopacket/layers"
2930
)
3031

3132
type ServiceTable struct {
32-
epcIDIPv4Table [trident.ServiceProtocol_UDP_SERVICE + 1]map[uint64]uint32
33-
epcIDIPv6Table map[EpcIDIPv6Key]uint32
34-
podClusterIDTable map[uint64]uint32
35-
podGroupIDTable map[uint64]uint32
36-
customServiceIpv4Table map[uint64]uint32
37-
customServiceIpv6Table map[EpcIDIPv6Key]uint32
33+
epcIDIPv4Table [trident.ServiceProtocol_UDP_SERVICE + 1]map[uint64]uint32
34+
epcIDIPv6Table map[EpcIDIPv6Key]uint32
35+
podClusterIDTable map[uint64]uint32
36+
podGroupIDTable map[uint64]uint32
37+
customServiceIpv4Table map[uint64]uint32
38+
customServiceIpv6Table map[EpcIDIPv6Key]uint32
39+
customServicePodGroup map[uint32]uint32
40+
customServicePodService map[uint32]uint32
41+
customServiceChost map[uint32]uint32
3842
}
3943

4044
type EpcIDIPv6Key struct {
@@ -113,12 +117,35 @@ func (s *ServiceTable) QueryPodService(podID, podNodeID, podClusterID, podGroupI
113117
return s.epcIDIPv4Table[serviceProtocol][genEpcIDIPv4Key(epcID, ipv4, serverPort)]
114118
}
115119

116-
func (s *ServiceTable) QueryCustomService(epcID int32, isIPv6 bool, ipv4 uint32, ipv6 net.IP, serverPort uint16) uint32 {
120+
func (s *ServiceTable) QueryCustomService(epcID int32, isIPv6 bool, ipv4 uint32, ipv6 net.IP, serverPort uint16, podServiceId, podGroupId, l3DeviceId uint32, l3DeviceType uint8) uint32 {
117121
// for performance optimization, return directly. Since when epcID <= 0, there is no Service information.
118122
if epcID <= 0 {
119123
return 0
120124
}
121125

126+
// 1. pod service
127+
if podServiceId != 0 {
128+
serviceId := s.customServicePodService[podServiceId]
129+
if serviceId != 0 {
130+
return serviceId
131+
}
132+
}
133+
// 2. pod group
134+
if podGroupId != 0 {
135+
serviceId := s.customServicePodGroup[podGroupId]
136+
if serviceId != 0 {
137+
return serviceId
138+
}
139+
}
140+
// 3. chost
141+
if l3DeviceId != 0 && l3DeviceType == uint8(flow_metrics.VMDevice) {
142+
serviceId := s.customServiceChost[l3DeviceId]
143+
if serviceId != 0 {
144+
return serviceId
145+
}
146+
}
147+
148+
// 4. port ip
122149
if isIPv6 {
123150
if len(s.customServiceIpv6Table) == 0 {
124151
return 0
@@ -141,11 +168,14 @@ func (s *ServiceTable) QueryCustomService(epcID int32, isIPv6 bool, ipv4 uint32,
141168

142169
func NewServiceTable(grpcServices []*trident.ServiceInfo) *ServiceTable {
143170
s := &ServiceTable{
144-
epcIDIPv6Table: make(map[EpcIDIPv6Key]uint32),
145-
podClusterIDTable: make(map[uint64]uint32),
146-
podGroupIDTable: make(map[uint64]uint32),
147-
customServiceIpv4Table: make(map[uint64]uint32),
148-
customServiceIpv6Table: make(map[EpcIDIPv6Key]uint32),
171+
epcIDIPv6Table: make(map[EpcIDIPv6Key]uint32),
172+
podClusterIDTable: make(map[uint64]uint32),
173+
podGroupIDTable: make(map[uint64]uint32),
174+
customServiceIpv4Table: make(map[uint64]uint32),
175+
customServiceIpv6Table: make(map[EpcIDIPv6Key]uint32),
176+
customServicePodGroup: make(map[uint32]uint32),
177+
customServicePodService: make(map[uint32]uint32),
178+
customServiceChost: make(map[uint32]uint32),
149179
}
150180
for i := range s.epcIDIPv4Table {
151181
s.epcIDIPv4Table[i] = make(map[uint64]uint32)
@@ -168,7 +198,10 @@ func NewServiceTable(grpcServices []*trident.ServiceInfo) *ServiceTable {
168198
s.podClusterIDTable[genPodXIDKey(podClusterId, trident.ServiceProtocol_ANY, 0)] = serviceId
169199
// Service from 'pod + port' generate 'pod_group_id + port' table
170200
case trident.ServiceType_POD_SERVICE_POD_GROUP:
171-
podGroupIds := svc.GetPodGroupIds() // FIXME @zhuofeng
201+
podGroupIds := svc.GetPodGroupIds()
202+
if len(podGroupIds) == 0 {
203+
break
204+
}
172205
podGroupId := podGroupIds[0]
173206
for _, port := range svc.GetServerPorts() {
174207
s.podGroupIDTable[genPodXIDKey(podGroupId, protocol, uint16(port))] = serviceId
@@ -239,6 +272,18 @@ func (s *ServiceTable) addCustomService(svc *trident.ServiceInfo) {
239272
epcId := int32(svc.GetEpcId())
240273
serviceId := svc.GetId()
241274

275+
for _, podGroupId := range svc.GetPodGroupIds() {
276+
s.customServicePodGroup[podGroupId] = serviceId
277+
}
278+
279+
for _, podServiceId := range svc.GetPodServiceIds() {
280+
s.customServicePodService[podServiceId] = serviceId
281+
}
282+
283+
for _, chostId := range svc.GetChostIds() {
284+
s.customServiceChost[chostId] = serviceId
285+
}
286+
242287
ips := svc.GetIps()
243288
if len(ips) == 0 {
244289
return
@@ -264,6 +309,10 @@ func (s *ServiceTable) addCustomService(svc *trident.ServiceInfo) {
264309
}
265310
}
266311

312+
func (s *ServiceTable) addCustomServicePodGroup(svc *trident.ServiceInfo) {
313+
314+
}
315+
267316
func (s *ServiceTable) String() string {
268317
sb := &strings.Builder{}
269318

@@ -382,5 +431,33 @@ func (s *ServiceTable) String() string {
382431
epcID, ipv6, _, port := parseEpcIDIPv6Key(&epcIP)
383432
fmt.Fprintf(sb, " %-6d %-15s %-15d %-6d \n", epcID, ipv6, port, id)
384433
}
434+
435+
if len(s.customServicePodService) > 0 {
436+
sb.WriteString("\npodServiceId custom service\n")
437+
sb.WriteString("\n7 podServiceId serviceID\n")
438+
sb.WriteString("------------------------------------------------------\n")
439+
for podServiceId, serviceId := range s.customServicePodService {
440+
fmt.Fprintf(sb, " %-11s %-15d \n", podServiceId, serviceId)
441+
}
442+
}
443+
444+
if len(s.customServicePodGroup) > 0 {
445+
sb.WriteString("\npodServiceId custom service\n")
446+
sb.WriteString("\n8 podGrouopId serviceID\n")
447+
sb.WriteString("------------------------------------------------------\n")
448+
for podGroupId, serviceId := range s.customServicePodGroup {
449+
fmt.Fprintf(sb, " %-11s %-15d \n", podGroupId, serviceId)
450+
}
451+
}
452+
453+
if len(s.customServiceChost) > 0 {
454+
sb.WriteString("\nchostId custom service\n")
455+
sb.WriteString("\n9 chostId serviceID\n")
456+
sb.WriteString("------------------------------------------------------\n")
457+
for chostId, serviceId := range s.customServiceChost {
458+
fmt.Fprintf(sb, " %-11s %-15d \n", chostId, serviceId)
459+
}
460+
}
461+
385462
return sb.String()
386463
}

0 commit comments

Comments
 (0)