introspection: expose the daemon's PID and PIDNS
Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
This commit is contained in:
		| @@ -3472,6 +3472,20 @@ file { | |||||||
|       type: TYPE_STRING |       type: TYPE_STRING | ||||||
|       json_name: "uuid" |       json_name: "uuid" | ||||||
|     } |     } | ||||||
|  |     field { | ||||||
|  |       name: "pid" | ||||||
|  |       number: 2 | ||||||
|  |       label: LABEL_OPTIONAL | ||||||
|  |       type: TYPE_UINT64 | ||||||
|  |       json_name: "pid" | ||||||
|  |     } | ||||||
|  |     field { | ||||||
|  |       name: "pidns" | ||||||
|  |       number: 3 | ||||||
|  |       label: LABEL_OPTIONAL | ||||||
|  |       type: TYPE_UINT64 | ||||||
|  |       json_name: "pidns" | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|   service { |   service { | ||||||
|     name: "Introspection" |     name: "Introspection" | ||||||
|   | |||||||
| @@ -273,6 +273,8 @@ type ServerResponse struct { | |||||||
| 	unknownFields protoimpl.UnknownFields | 	unknownFields protoimpl.UnknownFields | ||||||
|  |  | ||||||
| 	UUID  string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` | 	UUID  string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` | ||||||
|  | 	Pid   uint64 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` | ||||||
|  | 	Pidns uint64 `protobuf:"varint,3,opt,name=pidns,proto3" json:"pidns,omitempty"` // PID namespace, such as 4026531836 | ||||||
| } | } | ||||||
|  |  | ||||||
| func (x *ServerResponse) Reset() { | func (x *ServerResponse) Reset() { | ||||||
| @@ -314,6 +316,20 @@ func (x *ServerResponse) GetUUID() string { | |||||||
| 	return "" | 	return "" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (x *ServerResponse) GetPid() uint64 { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Pid | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (x *ServerResponse) GetPidns() uint64 { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Pidns | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
| var File_github_com_containerd_containerd_api_services_introspection_v1_introspection_proto protoreflect.FileDescriptor | var File_github_com_containerd_containerd_api_services_introspection_v1_introspection_proto protoreflect.FileDescriptor | ||||||
|  |  | ||||||
| var file_github_com_containerd_containerd_api_services_introspection_v1_introspection_proto_rawDesc = []byte{ | var file_github_com_containerd_containerd_api_services_introspection_v1_introspection_proto_rawDesc = []byte{ | ||||||
| @@ -362,29 +378,32 @@ var file_github_com_containerd_containerd_api_services_introspection_v1_introspe | |||||||
| 	0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, | 	0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, | ||||||
| 	0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x72, 0x6f, | 	0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x72, 0x6f, | ||||||
| 	0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, | 	0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, | ||||||
| 	0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x24, 0x0a, 0x0e, 0x53, | 	0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x4c, 0x0a, 0x0e, 0x53, | ||||||
| 	0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, | 	0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, | ||||||
| 	0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, | 	0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, | ||||||
| 	0x64, 0x32, 0xdf, 0x01, 0x0a, 0x0d, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, | 	0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, | ||||||
| 	0x69, 0x6f, 0x6e, 0x12, 0x76, 0x0a, 0x07, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x34, | 	0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x69, 0x64, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, | ||||||
| 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, | 	0x28, 0x04, 0x52, 0x05, 0x70, 0x69, 0x64, 0x6e, 0x73, 0x32, 0xdf, 0x01, 0x0a, 0x0d, 0x49, 0x6e, | ||||||
| 	0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, | 	0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x76, 0x0a, 0x07, 0x50, | ||||||
| 	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, | 	0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, | ||||||
| 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, | 	0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, | ||||||
| 	0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x72, 0x6f, | 	0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, | ||||||
| 	0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, | 	0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, | ||||||
| 	0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x53, | 	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, | ||||||
| 	0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, | 	0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, | ||||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x34, 0x2e, | 	0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, | ||||||
| 	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, | 	0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x16, 0x2e, | ||||||
| 	0x63, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, | 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, | ||||||
| 	0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, | 	0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, | ||||||
| 	0x6e, 0x73, 0x65, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, | 	0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x72, | ||||||
| 	0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, | 	0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, | ||||||
| 	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, | 	0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x4e, 0x5a, 0x4c, 0x67, | ||||||
| 	0x69, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, | 	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, | ||||||
| 	0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, | 	0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, | ||||||
| 	0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | 	0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, | ||||||
|  | 	0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, | ||||||
|  | 	0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, | ||||||
|  | 	0x74, 0x6f, 0x33, | ||||||
| } | } | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
|   | |||||||
| @@ -100,4 +100,6 @@ message PluginsResponse { | |||||||
|  |  | ||||||
| message ServerResponse { | message ServerResponse { | ||||||
| 	string uuid = 1; | 	string uuid = 1; | ||||||
|  | 	uint64 pid = 2; | ||||||
|  | 	uint64 pidns = 3; // PID namespace, such as 4026531836 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/content" | 	"github.com/containerd/containerd/cmd/ctr/commands/content" | ||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/events" | 	"github.com/containerd/containerd/cmd/ctr/commands/events" | ||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/images" | 	"github.com/containerd/containerd/cmd/ctr/commands/images" | ||||||
|  | 	"github.com/containerd/containerd/cmd/ctr/commands/info" | ||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/install" | 	"github.com/containerd/containerd/cmd/ctr/commands/install" | ||||||
| 	"github.com/containerd/containerd/cmd/ctr/commands/leases" | 	"github.com/containerd/containerd/cmd/ctr/commands/leases" | ||||||
| 	namespacesCmd "github.com/containerd/containerd/cmd/ctr/commands/namespaces" | 	namespacesCmd "github.com/containerd/containerd/cmd/ctr/commands/namespaces" | ||||||
| @@ -116,6 +117,7 @@ containerd CLI | |||||||
| 		install.Command, | 		install.Command, | ||||||
| 		ociCmd.Command, | 		ociCmd.Command, | ||||||
| 		sandboxes.Command, | 		sandboxes.Command, | ||||||
|  | 		info.Command, | ||||||
| 	}, extraCmds...) | 	}, extraCmds...) | ||||||
| 	app.Before = func(context *cli.Context) error { | 	app.Before = func(context *cli.Context) error { | ||||||
| 		if context.GlobalBool("debug") { | 		if context.GlobalBool("debug") { | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								cmd/ctr/commands/info/info.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								cmd/ctr/commands/info/info.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  |  | ||||||
|  |    Licensed 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 info | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	api "github.com/containerd/containerd/api/services/introspection/v1" | ||||||
|  | 	"github.com/containerd/containerd/cmd/ctr/commands" | ||||||
|  | 	ptypes "github.com/containerd/containerd/protobuf/types" | ||||||
|  | 	"github.com/urfave/cli" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type Info struct { | ||||||
|  | 	Server *api.ServerResponse `json:"server"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Command is a cli command to output the containerd server info | ||||||
|  | var Command = cli.Command{ | ||||||
|  | 	Name:  "info", | ||||||
|  | 	Usage: "print the server info", | ||||||
|  | 	Action: func(context *cli.Context) error { | ||||||
|  | 		client, ctx, cancel, err := commands.NewClient(context) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		defer cancel() | ||||||
|  | 		var info Info | ||||||
|  | 		info.Server, err = client.IntrospectionService().Server(ctx, &ptypes.Empty{}) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		commands.PrintAsJSON(info) | ||||||
|  | 		return nil | ||||||
|  | 	}, | ||||||
|  | } | ||||||
| @@ -20,6 +20,7 @@ import ( | |||||||
| 	context "context" | 	context "context" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  | 	"runtime" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
| 	api "github.com/containerd/containerd/api/services/introspection/v1" | 	api "github.com/containerd/containerd/api/services/introspection/v1" | ||||||
| @@ -105,8 +106,18 @@ func (l *Local) Server(ctx context.Context, _ *ptypes.Empty, _ ...grpc.CallOptio | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, errdefs.ToGRPC(err) | 		return nil, errdefs.ToGRPC(err) | ||||||
| 	} | 	} | ||||||
|  | 	pid := os.Getpid() | ||||||
|  | 	var pidns uint64 | ||||||
|  | 	if runtime.GOOS == "linux" { | ||||||
|  | 		pidns, err = statPIDNS(pid) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, errdefs.ToGRPC(err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	return &api.ServerResponse{ | 	return &api.ServerResponse{ | ||||||
| 		UUID:  u, | 		UUID:  u, | ||||||
|  | 		Pid:   uint64(pid), | ||||||
|  | 		Pidns: pidns, | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								services/introspection/pidns_linux.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								services/introspection/pidns_linux.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  |  | ||||||
|  |    Licensed 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 introspection | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func statPIDNS(pid int) (uint64, error) { | ||||||
|  | 	f := fmt.Sprintf("/proc/%d/ns/pid", pid) | ||||||
|  | 	st, err := os.Stat(f) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	stSys, ok := st.Sys().(*syscall.Stat_t) | ||||||
|  | 	if !ok { | ||||||
|  | 		return 0, fmt.Errorf("%T is not *syscall.Stat_t", st.Sys()) | ||||||
|  | 	} | ||||||
|  | 	return stSys.Ino, nil | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								services/introspection/pidns_others.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								services/introspection/pidns_others.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | //go:build !linux | ||||||
|  | // +build !linux | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  |  | ||||||
|  |    Licensed 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 introspection | ||||||
|  |  | ||||||
|  | func statPIDNS(pid int) (uint64, error) { | ||||||
|  | 	return 0, nil | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Akihiro Suda
					Akihiro Suda