@@ -2,13 +2,15 @@ package isaacnetwork
22
33import (
44 "math"
5+ "reflect"
56 "sync"
67 "sync/atomic"
78 "time"
89
910 "github.com/ProtoconNet/mitum2/network/quicstream"
1011 "github.com/ProtoconNet/mitum2/util"
1112 "github.com/ProtoconNet/mitum2/util/hint"
13+ "github.com/ProtoconNet/mitum2/util/localtime"
1214)
1315
1416var NodeMetricsHint = hint .MustNewHint ("node-metrics-v0.0.1" )
@@ -30,22 +32,64 @@ type NodeMetrics struct {
3032
3133func (m NodeMetrics ) MarshalJSON () ([]byte , error ) {
3234 type alias struct {
33- Hint hint.Type `json:"hint"`
34- Timestamp time .Time `json:"timestamp"`
35- Uptime string `json:"uptime"`
35+ hint.BaseHinter
36+ Timestamp localtime .Time `json:"timestamp"`
37+ Uptime util. ReadableDuration `json:"uptime"`
3638 Cumulative CumulativeMetrics `json:"cumulative"`
3739 Intervals map [string ]IntervalMetrics `json:"intervals"`
3840 }
3941
4042 return util .MarshalJSON (alias {
41- Hint : m . Hint (). Type () ,
42- Timestamp : m .Timestamp ,
43- Uptime : m .Uptime . String ( ),
43+ BaseHinter : m . BaseHinter ,
44+ Timestamp : localtime . New ( m .Timestamp ) ,
45+ Uptime : util . ReadableDuration ( m .Uptime ),
4446 Cumulative : m .Cumulative ,
4547 Intervals : m .Intervals ,
4648 })
4749}
4850
51+ func (m * NodeMetrics ) UnmarshalJSON (b []byte ) error {
52+ e := util .StringError ("unmarshal NodeMetrics" )
53+
54+ type alias struct {
55+ hint.BaseHinter
56+ Timestamp time.Time `json:"timestamp"`
57+ Uptime * util.ReadableDuration `json:"uptime"`
58+ Cumulative CumulativeMetrics `json:"cumulative"`
59+ Intervals map [string ]IntervalMetrics `json:"intervals"`
60+ }
61+
62+ var u alias
63+
64+ if err := util .UnmarshalJSON (b , & u ); err != nil {
65+ return e .Wrap (err )
66+ }
67+
68+ m .BaseHinter = u .BaseHinter
69+ m .Timestamp = u .Timestamp
70+ m .Cumulative = u .Cumulative
71+ m .Intervals = u .Intervals
72+
73+ durArgs := [][2 ]interface {}{
74+ {u .Uptime , & m .Uptime },
75+ }
76+
77+ for i := range durArgs {
78+ v := durArgs [i ][0 ].(* util.ReadableDuration ) //nolint:forcetypeassert //...
79+ t := durArgs [i ][1 ].(* time.Duration ) //nolint:forcetypeassert //...
80+
81+ if reflect .ValueOf (v ).IsZero () {
82+ continue
83+ }
84+
85+ if err := util .SetInterfaceValue (time .Duration (* v ), t ); err != nil {
86+ return err
87+ }
88+ }
89+
90+ return nil
91+ }
92+
4993type CumulativeMetrics struct {
5094 QuicBytesSent uint64 `json:"quic_bytes_sent"`
5195 QuicBytesReceived uint64 `json:"quic_bytes_received"`
0 commit comments