Skip to content

Commit 9bdea08

Browse files
authored
Merge pull request #69 from HyperloopUPV-H8/backend/logger-implementation-hotfix
[backend] logger-implementation
2 parents 9ed19c8 + 1a4f628 commit 9bdea08

11 files changed

Lines changed: 275 additions & 127 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
build
2+
.vscode
23

34
# GOOGLE API KEY
45
secret.json

backend/cmd/main.go

Lines changed: 61 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,11 @@ import (
2222
"github.com/HyperloopUPV-H8/h9-backend/internal/excel/ade"
2323
"github.com/HyperloopUPV-H8/h9-backend/internal/excel/utils"
2424
"github.com/HyperloopUPV-H8/h9-backend/internal/info"
25-
"github.com/HyperloopUPV-H8/h9-backend/internal/logger_handler"
26-
protection_logger "github.com/HyperloopUPV-H8/h9-backend/internal/message_logger"
2725
"github.com/HyperloopUPV-H8/h9-backend/internal/message_transfer"
28-
"github.com/HyperloopUPV-H8/h9-backend/internal/order_logger"
2926
"github.com/HyperloopUPV-H8/h9-backend/internal/order_transfer"
30-
"github.com/HyperloopUPV-H8/h9-backend/internal/packet_logger"
3127
"github.com/HyperloopUPV-H8/h9-backend/internal/pod_data"
3228
"github.com/HyperloopUPV-H8/h9-backend/internal/server"
33-
"github.com/HyperloopUPV-H8/h9-backend/internal/state_space_logger"
3429
"github.com/HyperloopUPV-H8/h9-backend/internal/update_factory"
35-
"github.com/HyperloopUPV-H8/h9-backend/internal/value_logger"
3630
vehicle_models "github.com/HyperloopUPV-H8/h9-backend/internal/vehicle/models"
3731
"github.com/HyperloopUPV-H8/h9-backend/internal/ws_handle"
3832
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
@@ -51,6 +45,12 @@ import (
5145
"github.com/google/gopacket/pcap"
5246
"github.com/pelletier/go-toml/v2"
5347
trace "github.com/rs/zerolog/log"
48+
49+
"github.com/HyperloopUPV-H8/h9-backend/pkg/logger"
50+
data_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/data"
51+
messages_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/messages"
52+
order_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/order"
53+
state_logger "github.com/HyperloopUPV-H8/h9-backend/pkg/logger/state"
5454
)
5555

5656
var traceLevel = flag.String("trace", "info", "set the trace level (\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\")")
@@ -124,20 +124,15 @@ func main() {
124124
updateFactory := update_factory.NewFactory()
125125

126126
// <--- logger --->
127-
packetLogger := packet_logger.NewPacketLogger(podData.Boards, config.PacketLogger)
128-
valueLogger := value_logger.NewValueLogger(podData.Boards, config.ValueLogger)
129-
orderLogger := order_logger.NewOrderLogger(podData.Boards, config.OrderLogger)
130-
protectionLogger := protection_logger.NewMessageLogger(config.Vehicle.Messages.InfoIdKey, config.Vehicle.Messages.FaultIdKey, config.Vehicle.Messages.WarningIdKey, config.ProtectionLogger)
131-
stateSpaceLogger := state_space_logger.NewStateSpaceLogger(info.MessageIds.StateSpace)
132-
133-
loggers := map[string]logger_handler.Logger{
134-
"packets": &packetLogger,
135-
"values": &valueLogger,
136-
"orders": &orderLogger,
137-
"protections": &protectionLogger,
138-
"stateSpace": &stateSpaceLogger,
127+
var boardMap map[abstraction.BoardId]string
128+
var subloggers = map[abstraction.LoggerName]abstraction.Logger{
129+
data_logger.Name: data_logger.NewLogger(),
130+
messages_logger.Name: messages_logger.NewLogger(boardMap),
131+
order_logger.Name: order_logger.NewLogger(),
132+
state_logger.Name: state_logger.NewLogger(),
139133
}
140-
loggerHandler := logger_handler.NewLoggerHandler(loggers, config.LoggerHandler)
134+
135+
loggerHandler := logger.NewLogger(subloggers)
141136

142137
// <--- order transfer --->
143138
idToBoard := make(map[uint16]string)
@@ -167,37 +162,64 @@ func main() {
167162
transp.SetAPI(&TransportAPI{
168163
OnNotification: func(notification abstraction.TransportNotification) {
169164
packet := notification.(transport.PacketNotification)
165+
170166
switch p := packet.Packet.(type) {
171167
case *data.Packet:
172-
if _, ok := orders[p.Id()]; ok {
173-
loggerHandler.Log(order_logger.LoggableOrder(*p))
174-
return
175-
}
176-
177168
update := updateFactory.NewUpdate(p)
178169
dataTransfer.Update(update)
179170

180-
loggerHandler.Log(packet_logger.ToLoggablePacket(p))
171+
err = loggerHandler.PushRecord(&data_logger.Record{
172+
Packet: p,
173+
})
181174

182-
for id, value := range p.GetValues() {
183-
loggerHandler.Log(value_logger.ToLoggableValue(string(id), value, p.Timestamp()))
175+
if err != nil {
176+
fmt.Println("Error pushing record to logger: ", err)
184177
}
178+
185179
case *info_packet.Packet:
186180
messageTransfer.SendMessage(p)
187-
loggerHandler.Log(protection_logger.LoggableInfo(*p))
181+
182+
err = loggerHandler.PushRecord(&messages_logger.Record{
183+
Packet: p,
184+
})
185+
186+
if err != nil {
187+
fmt.Println("Error pushing record to logger: ", err)
188+
}
189+
188190
case *protection.Packet:
189191
messageTransfer.SendMessage(p)
190-
loggerHandler.Log(protection_logger.LoggableProtection(*p))
192+
193+
packet := info_packet.NewPacket(p.Id())
194+
packet.BoardId = p.BoardId
195+
packet.Timestamp = p.Timestamp
196+
packet.Msg = info_packet.InfoData(fmt.Sprint(p))
197+
198+
err = loggerHandler.PushRecord(&messages_logger.Record{
199+
Packet: packet,
200+
})
201+
202+
if err != nil {
203+
fmt.Println("Error pushing record to logger: ", err)
204+
}
205+
191206
case *blcu_packet.Ack:
192207
if useBlcu {
193208
blcu.NotifyAck()
194209
}
210+
195211
case *state.Space:
196-
for _, row := range p.State() {
197-
loggerHandler.Log(state_space_logger.LoggableStateSpaceRow(row))
212+
err = loggerHandler.PushRecord(&state_logger.Record{
213+
Packet: p,
214+
})
215+
216+
if err != nil {
217+
fmt.Println("Error pushing record to logger: ", err)
198218
}
219+
199220
case *order.Add:
200221
orderTransfer.AddStateOrders(*p)
222+
201223
case *order.Remove:
202224
orderTransfer.RemoveStateOrders(*p)
203225
}
@@ -259,7 +281,13 @@ func main() {
259281
trace.Error().Any("order", order).Err(err).Msg("error sending order")
260282
}
261283

262-
loggerHandler.Log(order_logger.LoggableOrder(order))
284+
err = loggerHandler.PushRecord(&order_logger.Record{
285+
Packet: &order,
286+
})
287+
288+
if err != nil {
289+
fmt.Println("Error pushing record to logger: ", err)
290+
}
263291
}
264292
}()
265293

@@ -285,7 +313,7 @@ func main() {
285313

286314
websocketBroker.RegisterHandle(&connectionTransfer, config.Connections.UpdateTopic, "connection/update")
287315
websocketBroker.RegisterHandle(&dataTransfer, "podData/update")
288-
websocketBroker.RegisterHandle(&loggerHandler, config.LoggerHandler.Topics.Enable)
316+
websocketBroker.RegisterHandle(loggerHandler, config.LoggerHandler.Topics.Enable)
289317
websocketBroker.RegisterHandle(&messageTransfer, "message/update")
290318
websocketBroker.RegisterHandle(&orderTransfer, config.Orders.SendTopic, "order/stateOrders")
291319

backend/pkg/abstraction/logger.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type LoggerRequest interface {
1616
// Logger is the module in charge of storing and retrieving information from the
1717
// hard drive, making it persistent.
1818
type Logger interface {
19-
Start(startKeys []LoggerName) error
20-
Stop(stopKeys []LoggerName) error
19+
Start() error
20+
Stop() error
2121
// PushRecord will store a record to disk
2222
PushRecord(LoggerRecord) error
2323
// PullRecord will retrieve a record from disk

backend/pkg/logger/CHANGELOG.md

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
# Logger Changelog
22

3-
## v0.0.0
3+
## v0
44

5-
### v0.3.0
5+
### v0.3
66

7-
#### v0.3.1
7+
#### v0.3.0
88

99
- Integrate abstraction
1010
- "Keys" concept implementation
1111
- Data sublogger
1212
- Add constants
1313
- Add map of valueTypes
1414

15-
#### v0.3.2
15+
#### v0.3.1
1616

1717
- Errors and name publicity fixed
1818

19-
#### v0.3.3
19+
#### v0.3.2
2020

2121
- Change from map to list
2222
- Use more descriptive names
2323
- Fix constants
2424

25-
#### v0.3.4
25+
#### v0.3.3
2626

2727
- Change type check logic
2828
- Handle writer errors
@@ -31,19 +31,31 @@
3131
- Prevent concurrency-related errors
3232
- Logic fixes
3333

34-
## v1.0.0
34+
## v1
3535

36-
### v1.1.0
36+
### v1.0
3737

38-
#### v1.1.1
38+
#### v1.0.0
3939

4040
- Messages sublogger
4141
- Handle json timestamp
4242

43-
#### v1.1.2
43+
#### v1.0.1
4444

4545
- Order sublogger
4646

47-
#### v1.1.3
47+
#### v1.0.2
4848

4949
- State sublogger
50+
51+
### v1.2
52+
53+
#### v1.2.0
54+
55+
- Implement logger into cmd
56+
- Fix keys logic
57+
- Fix log logic
58+
59+
#### v1.2.1
60+
61+
- Change logging paths

backend/pkg/logger/data/logger.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,35 @@ type Logger struct {
2525
// An atomic boolean is used in order to use CompareAndSwap in the Start and Stop methods
2626
running *atomic.Bool
2727
fileLock *sync.RWMutex
28-
// initialTime fixes the starting time of the log
29-
initialTime time.Time
3028
// valueFileSlice is a map that contains the file of each value
3129
valueFileSlice map[data.ValueName]io.WriteCloser
3230
}
3331

3432
// Record is a struct that implements the abstraction.LoggerRecord interface
3533
type Record struct {
36-
packet *data.Packet
34+
Packet *data.Packet
3735
}
3836

39-
func (data *Record) Name() abstraction.LoggerName {
37+
func (record *Record) Name() abstraction.LoggerName {
4038
return Name
4139
}
4240

41+
func NewLogger() *Logger {
42+
logger := &Logger{
43+
valueFileSlice: make(map[data.ValueName]io.WriteCloser),
44+
running: &atomic.Bool{},
45+
fileLock: &sync.RWMutex{},
46+
}
47+
48+
logger.running.Store(false)
49+
return logger
50+
}
51+
4352
func (sublogger *Logger) Start() error {
4453
if !sublogger.running.CompareAndSwap(false, true) {
4554
fmt.Println("Logger already running")
4655
return nil
4756
}
48-
sublogger.initialTime = time.Now()
4957

5058
fmt.Println("Logger started")
5159
return nil
@@ -74,15 +82,15 @@ func (sublogger *Logger) PushRecord(record abstraction.LoggerRecord) error {
7482
}
7583
}
7684

77-
valueMap := dataRecord.packet.GetValues()
85+
valueMap := dataRecord.Packet.GetValues()
7886

7987
sublogger.fileLock.Lock()
8088
defer sublogger.fileLock.Unlock()
8189

8290
writerErr := error(nil)
8391
for valueName, value := range valueMap {
84-
var packet *Record
85-
timestamp := packet.packet.Timestamp()
92+
93+
timestamp := dataRecord.Packet.Timestamp()
8694

8795
var val string
8896

@@ -99,7 +107,10 @@ func (sublogger *Logger) PushRecord(record abstraction.LoggerRecord) error {
99107

100108
file, ok := sublogger.valueFileSlice[valueName]
101109
if !ok {
102-
f, err := os.Create(path.Join(string(valueName), fmt.Sprintf("%s_%s.csv", valueName, packet.packet.Timestamp().Format("3339"))))
110+
filename := path.Join("logger/data", fmt.Sprintf("data_%s", logger.Timestamp.Format(time.RFC3339)), fmt.Sprintf("%s.csv", valueName))
111+
os.MkdirAll(path.Dir(filename), os.ModePerm)
112+
113+
f, err := os.Create(path.Join(filename))
103114
if err != nil {
104115
return &logger.ErrCreatingFile{
105116
Name: Name,
@@ -125,11 +136,16 @@ func (sublogger *Logger) PullRecord(request abstraction.LoggerRequest) (abstract
125136
panic("TODO!")
126137
}
127138

128-
func Stop(sublogger *Logger) {
139+
func (sublogger *Logger) Stop() error {
129140
if !sublogger.running.CompareAndSwap(true, false) {
130141
fmt.Println("Logger already stopped")
131-
return
142+
return nil
143+
}
144+
145+
for _, file := range sublogger.valueFileSlice {
146+
file.Close()
132147
}
133148

134149
fmt.Println("Logger stopped")
150+
return nil
135151
}

backend/pkg/logger/errors.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,11 @@ type ErrWrongRecordType struct {
4848
func (err *ErrWrongRecordType) Error() string {
4949
return fmt.Sprintf("Wrong record type for logger %s at %s, expected %T, got %T", err.Name, err.Timestamp.Format(time.RFC3339), err.Expected.Name(), err.Received.Name())
5050
}
51+
52+
type ErrParsingLoggerMap struct {
53+
Name abstraction.LoggerName
54+
}
55+
56+
func (err ErrParsingLoggerMap) Error() string {
57+
return fmt.Sprintf("Error parsing logger map for logger %s", err.Name)
58+
}

0 commit comments

Comments
 (0)