diff --git a/.gitignore b/.gitignore index c426c32..8e93b7b 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ \ No newline at end of file +.vscode/ +/watchdog-go/watchdog-go.exe diff --git a/unos-proto/src/main/proto/watchdog/push_metrics.proto b/unos-proto/src/main/proto/watchdog/push_metrics.proto index c2a225a..d065d4e 100644 --- a/unos-proto/src/main/proto/watchdog/push_metrics.proto +++ b/unos-proto/src/main/proto/watchdog/push_metrics.proto @@ -4,6 +4,7 @@ import "google/protobuf/empty.proto"; import "google/protobuf/timestamp.proto"; package watchdog; +option go_package = "git.usbharu.dev/usbharu/unos/watchdog"; enum Status { OK = 0; diff --git a/watchdog-go/config.ini b/watchdog-go/config.ini new file mode 100644 index 0000000..042691a --- /dev/null +++ b/watchdog-go/config.ini @@ -0,0 +1,2 @@ +[Parent] +url = localhost:8080 \ No newline at end of file diff --git a/watchdog-go/git.usbharu.dev/usbharu/unos/watchdog/push_metrics.pb.go b/watchdog-go/git.usbharu.dev/usbharu/unos/watchdog/push_metrics.pb.go new file mode 100644 index 0000000..c319d36 --- /dev/null +++ b/watchdog-go/git.usbharu.dev/usbharu/unos/watchdog/push_metrics.pb.go @@ -0,0 +1,270 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v4.25.3 +// source: watchdog/push_metrics.proto + +package watchdog + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Status int32 + +const ( + Status_OK Status = 0 + Status_DEAD Status = 1 + Status_UNKNOWN Status = 2 + Status_NOT_GOOD Status = 3 +) + +// Enum value maps for Status. +var ( + Status_name = map[int32]string{ + 0: "OK", + 1: "DEAD", + 2: "UNKNOWN", + 3: "NOT_GOOD", + } + Status_value = map[string]int32{ + "OK": 0, + "DEAD": 1, + "UNKNOWN": 2, + "NOT_GOOD": 3, + } +) + +func (x Status) Enum() *Status { + p := new(Status) + *p = x + return p +} + +func (x Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Status) Descriptor() protoreflect.EnumDescriptor { + return file_watchdog_push_metrics_proto_enumTypes[0].Descriptor() +} + +func (Status) Type() protoreflect.EnumType { + return &file_watchdog_push_metrics_proto_enumTypes[0] +} + +func (x Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Status.Descriptor instead. +func (Status) EnumDescriptor() ([]byte, []int) { + return file_watchdog_push_metrics_proto_rawDescGZIP(), []int{0} +} + +type Metric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ObjectId string `protobuf:"bytes,2,opt,name=object_id,json=objectId,proto3" json:"object_id,omitempty"` + Domain string `protobuf:"bytes,3,opt,name=domain,proto3" json:"domain,omitempty"` + Status Status `protobuf:"varint,4,opt,name=status,proto3,enum=watchdog.Status" json:"status,omitempty"` + Value string `protobuf:"bytes,5,opt,name=value,proto3" json:"value,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (x *Metric) Reset() { + *x = Metric{} + if protoimpl.UnsafeEnabled { + mi := &file_watchdog_push_metrics_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Metric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Metric) ProtoMessage() {} + +func (x *Metric) ProtoReflect() protoreflect.Message { + mi := &file_watchdog_push_metrics_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Metric.ProtoReflect.Descriptor instead. +func (*Metric) Descriptor() ([]byte, []int) { + return file_watchdog_push_metrics_proto_rawDescGZIP(), []int{0} +} + +func (x *Metric) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Metric) GetObjectId() string { + if x != nil { + return x.ObjectId + } + return "" +} + +func (x *Metric) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + +func (x *Metric) GetStatus() Status { + if x != nil { + return x.Status + } + return Status_OK +} + +func (x *Metric) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +func (x *Metric) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +var File_watchdog_push_metrics_proto protoreflect.FileDescriptor + +var file_watchdog_push_metrics_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x77, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x77, + 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcb, 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x77, 0x61, 0x74, 0x63, + 0x68, 0x64, 0x6f, 0x67, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2a, 0x35, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x06, 0x0a, + 0x02, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, + 0x4e, 0x4f, 0x54, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x03, 0x32, 0x46, 0x0a, 0x12, 0x50, 0x75, + 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x30, 0x0a, 0x04, 0x50, 0x75, 0x73, 0x68, 0x12, 0x10, 0x2e, 0x77, 0x61, 0x74, 0x63, 0x68, + 0x64, 0x6f, 0x67, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x2e, 0x75, 0x73, 0x62, 0x68, 0x61, 0x72, + 0x75, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x75, 0x73, 0x62, 0x68, 0x61, 0x72, 0x75, 0x2f, 0x75, 0x6e, + 0x6f, 0x73, 0x2f, 0x77, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_watchdog_push_metrics_proto_rawDescOnce sync.Once + file_watchdog_push_metrics_proto_rawDescData = file_watchdog_push_metrics_proto_rawDesc +) + +func file_watchdog_push_metrics_proto_rawDescGZIP() []byte { + file_watchdog_push_metrics_proto_rawDescOnce.Do(func() { + file_watchdog_push_metrics_proto_rawDescData = protoimpl.X.CompressGZIP(file_watchdog_push_metrics_proto_rawDescData) + }) + return file_watchdog_push_metrics_proto_rawDescData +} + +var file_watchdog_push_metrics_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_watchdog_push_metrics_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_watchdog_push_metrics_proto_goTypes = []interface{}{ + (Status)(0), // 0: watchdog.Status + (*Metric)(nil), // 1: watchdog.Metric + (*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 3: google.protobuf.Empty +} +var file_watchdog_push_metrics_proto_depIdxs = []int32{ + 0, // 0: watchdog.Metric.status:type_name -> watchdog.Status + 2, // 1: watchdog.Metric.timestamp:type_name -> google.protobuf.Timestamp + 1, // 2: watchdog.PushMetricsService.Push:input_type -> watchdog.Metric + 3, // 3: watchdog.PushMetricsService.Push:output_type -> google.protobuf.Empty + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_watchdog_push_metrics_proto_init() } +func file_watchdog_push_metrics_proto_init() { + if File_watchdog_push_metrics_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_watchdog_push_metrics_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Metric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_watchdog_push_metrics_proto_rawDesc, + NumEnums: 1, + NumMessages: 1, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_watchdog_push_metrics_proto_goTypes, + DependencyIndexes: file_watchdog_push_metrics_proto_depIdxs, + EnumInfos: file_watchdog_push_metrics_proto_enumTypes, + MessageInfos: file_watchdog_push_metrics_proto_msgTypes, + }.Build() + File_watchdog_push_metrics_proto = out.File + file_watchdog_push_metrics_proto_rawDesc = nil + file_watchdog_push_metrics_proto_goTypes = nil + file_watchdog_push_metrics_proto_depIdxs = nil +} diff --git a/watchdog-go/git.usbharu.dev/usbharu/unos/watchdog/push_metrics_grpc.pb.go b/watchdog-go/git.usbharu.dev/usbharu/unos/watchdog/push_metrics_grpc.pb.go new file mode 100644 index 0000000..eeb4cc3 --- /dev/null +++ b/watchdog-go/git.usbharu.dev/usbharu/unos/watchdog/push_metrics_grpc.pb.go @@ -0,0 +1,106 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v4.25.3 +// source: watchdog/push_metrics.proto + +package watchdog + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// PushMetricsServiceClient is the client API for PushMetricsService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type PushMetricsServiceClient interface { + Push(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*emptypb.Empty, error) +} + +type pushMetricsServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewPushMetricsServiceClient(cc grpc.ClientConnInterface) PushMetricsServiceClient { + return &pushMetricsServiceClient{cc} +} + +func (c *pushMetricsServiceClient) Push(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/watchdog.PushMetricsService/Push", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// PushMetricsServiceServer is the server API for PushMetricsService service. +// All implementations must embed UnimplementedPushMetricsServiceServer +// for forward compatibility +type PushMetricsServiceServer interface { + Push(context.Context, *Metric) (*emptypb.Empty, error) + mustEmbedUnimplementedPushMetricsServiceServer() +} + +// UnimplementedPushMetricsServiceServer must be embedded to have forward compatible implementations. +type UnimplementedPushMetricsServiceServer struct { +} + +func (UnimplementedPushMetricsServiceServer) Push(context.Context, *Metric) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Push not implemented") +} +func (UnimplementedPushMetricsServiceServer) mustEmbedUnimplementedPushMetricsServiceServer() {} + +// UnsafePushMetricsServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to PushMetricsServiceServer will +// result in compilation errors. +type UnsafePushMetricsServiceServer interface { + mustEmbedUnimplementedPushMetricsServiceServer() +} + +func RegisterPushMetricsServiceServer(s grpc.ServiceRegistrar, srv PushMetricsServiceServer) { + s.RegisterService(&PushMetricsService_ServiceDesc, srv) +} + +func _PushMetricsService_Push_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Metric) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PushMetricsServiceServer).Push(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/watchdog.PushMetricsService/Push", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PushMetricsServiceServer).Push(ctx, req.(*Metric)) + } + return interceptor(ctx, in, info, handler) +} + +// PushMetricsService_ServiceDesc is the grpc.ServiceDesc for PushMetricsService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var PushMetricsService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "watchdog.PushMetricsService", + HandlerType: (*PushMetricsServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Push", + Handler: _PushMetricsService_Push_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "watchdog/push_metrics.proto", +} diff --git a/watchdog-go/go.mod b/watchdog-go/go.mod new file mode 100644 index 0000000..94d755e --- /dev/null +++ b/watchdog-go/go.mod @@ -0,0 +1,25 @@ +module git.usbharu.dev/usbharu/unos/watchdog-go + +go 1.22.1 + +require ( + github.com/shirou/gopsutil/v3 v3.24.2 + google.golang.org/grpc v1.62.1 + google.golang.org/protobuf v1.33.0 + gopkg.in/ini.v1 v1.67.0 +) + +require ( + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240308144416-29370a3891b7 // indirect +) diff --git a/watchdog-go/go.sum b/watchdog-go/go.sum new file mode 100644 index 0000000..ade3532 --- /dev/null +++ b/watchdog-go/go.sum @@ -0,0 +1,61 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= +github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240308144416-29370a3891b7 h1:em/y72n4XlYRtayY/cVj6pnVzHa//BDA1BdoO+z9mdE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240308144416-29370a3891b7/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/watchdog-go/main.go b/watchdog-go/main.go new file mode 100644 index 0000000..98e4160 --- /dev/null +++ b/watchdog-go/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "context" + "fmt" + "git.usbharu.dev/usbharu/unos/watchdog-go/git.usbharu.dev/usbharu/unos/watchdog" + "github.com/shirou/gopsutil/v3/mem" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/protobuf/types/known/timestamppb" + "gopkg.in/ini.v1" + "log" + "regexp" + "strings" + "time" +) + +type Config struct { + Url string + ClientName string + ClientDomain string +} + +var regex = regexp.MustCompile(`^[a-zA-Z0-9-_]`) + +func main() { + fmt.Println("start gRPC Client.") + + load, err := ini.Load("config.ini") + if err != nil { + log.Fatal(err) + return + } + + config := Config{ + Url: load.Section("Parent").Key("url").String(), + ClientName: load.Section("Watch").Key("name").MustString("Watch Dog Go"), + ClientDomain: load.Section("Watch").Key("domain").MustString("watchdog.internal"), + } + + dial, err := grpc.Dial(config.Url, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + log.Fatal(err) + return + } + + metrics := make(chan watchdog.Metric) + + client := watchdog.NewPushMetricsServiceClient(dial) + + go func() { + for { + metricArray := getMetrics(config) + for _, metric := range metricArray { + metrics <- metric + } + time.Sleep(1 * time.Minute) + } + }() + + for metric := range metrics { + _, err := client.Push(context.Background(), &metric) + if err != nil { + log.Println(err) + continue + } + } +} + +func getMetrics(config Config) []watchdog.Metric { + v, _ := mem.VirtualMemory() + + return []watchdog.Metric{usedMemory(*v, config)} +} + +func usedMemory(stat mem.VirtualMemoryStat, config Config) watchdog.Metric { + name := config.ClientName + " Used Memory" + usedMemory := fmt.Sprintf("%g", stat.UsedPercent) + + log.Printf("Mem: %s%%\n", usedMemory) + + return watchdog.Metric{ + Name: name, + ObjectId: toId(name), + Domain: config.ClientDomain, + Status: watchdog.Status_OK, + Value: usedMemory, + Timestamp: timestamppb.Now(), + } +} + +func toId(value string) string { + return regex.ReplaceAllString(strings.ReplaceAll(value, " ", "-"), "") +}