-
-
Notifications
You must be signed in to change notification settings - Fork 88
/
dogger.go
145 lines (124 loc) · 3.46 KB
/
dogger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package dogger
import (
"context"
"fmt"
"io"
"github.com/rs/zerolog/log"
"github.com/dyrector-io/dyrectorio/golang/internal/config"
"github.com/dyrector-io/dyrectorio/protobuf/go/agent"
"github.com/dyrector-io/dyrectorio/protobuf/go/common"
)
type DeploymentLogger struct {
deploymentID string
requestID string
stream agent.Agent_DeploymentStatusClient
logs []string
ctx context.Context
appConfig *config.CommonConfiguration
io.StringWriter
}
func NewDeploymentLogger(ctx context.Context, deploymentID *string,
stream agent.Agent_DeploymentStatusClient,
appConfig *config.CommonConfiguration,
) *DeploymentLogger {
dog := &DeploymentLogger{
stream: stream,
logs: []string{},
ctx: ctx,
requestID: "missing-request-id",
appConfig: appConfig,
}
if deploymentID != nil {
dog.deploymentID = *deploymentID
}
return dog
}
func (dog *DeploymentLogger) SetRequestID(requestID string) {
dog.requestID = requestID
}
// Writes to all available streams: std.out and grpc streams
func (dog *DeploymentLogger) Write(messages ...string) {
for i := range messages {
log.Info().Str("deployment", dog.deploymentID).Msg(messages[i])
dog.logs = append(dog.logs, messages...)
}
if dog.stream != nil {
err := dog.stream.Send(&common.DeploymentStatusMessage{
Log: messages,
})
if err != nil {
log.Error().Err(err).Stack().Str("deployment", dog.deploymentID).Msg("Write error")
}
}
}
func (dog *DeploymentLogger) WriteDeploymentStatus(status common.DeploymentStatus, messages ...string) {
for i := range messages {
log.Info().Str("deployment", dog.deploymentID).Msg(messages[i])
dog.logs = append(dog.logs, messages...)
}
if dog.stream != nil {
err := dog.stream.Send(&common.DeploymentStatusMessage{
Log: messages,
Data: &common.DeploymentStatusMessage_DeploymentStatus{
DeploymentStatus: status,
},
})
if err != nil {
log.Error().Err(err).Stack().Str("deployment", dog.deploymentID).Msg("Write deployment status error")
}
}
}
func (dog *DeploymentLogger) WriteContainerState(containerState string, messages ...string) {
prefix := fmt.Sprintf("%s - %s", dog.requestID, containerState)
for i := range messages {
log.Info().Str("prefix", prefix).Msg(messages[i])
dog.logs = append(dog.logs, messages...)
}
if dog.stream != nil {
instance := &common.DeploymentStatusMessage_Instance{
Instance: &common.InstanceDeploymentItem{
InstanceId: dog.requestID,
State: MapContainerState(containerState),
},
}
err := dog.stream.Send(&common.DeploymentStatusMessage{
Log: messages,
Data: instance,
})
if err != nil {
log.Error().
Err(err).
Stack().
Str("deployment", dog.deploymentID).
Str("prefix", prefix).
Msg("Write container state error")
}
}
}
func (dog *DeploymentLogger) GetLogs() []string {
return dog.logs
}
func (dog *DeploymentLogger) WriteString(s string) (int, error) {
dog.Write(s)
return len(s), nil
}
func MapContainerState(state string) common.ContainerState {
switch state {
case "created":
return common.ContainerState_CREATED
case "restarting":
return common.ContainerState_RESTARTING
case "running":
return common.ContainerState_RUNNING
case "removing":
return common.ContainerState_REMOVING
case "paused":
return common.ContainerState_PAUSED
case "exited":
return common.ContainerState_EXITED
case "dead":
return common.ContainerState_DEAD
default:
return common.ContainerState_CONTAINER_STATE_UNSPECIFIED
}
}