@@ -13,15 +13,14 @@ import (
13
13
"fmt"
14
14
"os"
15
15
"os/signal"
16
- "runtime"
17
16
"strings"
18
17
"syscall"
19
18
"time"
20
19
21
20
"github.com/docker/docker/client"
22
- "github.com/pbnjay/memory"
23
21
"github.com/pkg/errors"
24
22
23
+ "gitlab.com/postgres-ai/database-lab/v3/internal/billing"
25
24
"gitlab.com/postgres-ai/database-lab/v3/internal/cloning"
26
25
"gitlab.com/postgres-ai/database-lab/v3/internal/diagnostic"
27
26
"gitlab.com/postgres-ai/database-lab/v3/internal/embeddedui"
@@ -56,7 +55,7 @@ func main() {
56
55
}
57
56
58
57
logFilter := log .GetFilter ()
59
- logFilter .ReloadLogRegExp ([]string {cfg .Server .VerificationToken , cfg .Platform .AccessToken })
58
+ logFilter .ReloadLogRegExp ([]string {cfg .Server .VerificationToken , cfg .Platform .AccessToken , cfg . Platform . OrgKey })
60
59
61
60
config .ApplyGlobals (cfg )
62
61
@@ -83,6 +82,13 @@ func main() {
83
82
log .Msg ("Database Lab Instance ID:" , engProps .InstanceID )
84
83
log .Msg ("Database Lab Engine version:" , version .GetVersion ())
85
84
85
+ // Create a platform service to make requests to Platform.
86
+ platformSvc , err := platform .New (ctx , cfg .Platform , engProps .InstanceID )
87
+ if err != nil {
88
+ log .Errf (err .Error ())
89
+ return
90
+ }
91
+
86
92
if cfg .Server .VerificationToken == "" {
87
93
log .Warn ("Verification Token is empty. Database Lab Engine is insecure" )
88
94
}
@@ -97,33 +103,22 @@ func main() {
97
103
98
104
defer networks .Stop (docker , internalNetworkID , engProps .ContainerName )
99
105
100
- // Create a platform service to make requests to Platform.
101
- platformSvc , err := platform .New (ctx , cfg .Platform )
102
- if err != nil {
103
- log .Errf (errors .WithMessage (err , "failed to create a new platform service" ).Error ())
104
- return
105
- }
106
-
107
106
dbCfg := & resources.DB {
108
107
Username : cfg .Global .Database .User (),
109
108
DBName : cfg .Global .Database .Name (),
110
109
}
111
110
112
- tm , err := telemetry .New (cfg .Global , engProps )
113
- if err != nil {
114
- log .Errf (errors .WithMessage (err , "failed to initialize a telemetry service" ).Error ())
115
- return
116
- }
111
+ tm := telemetry .New (platformSvc , engProps .InstanceID )
117
112
118
113
pm := pool .NewPoolManager (& cfg .PoolManager , runner )
119
114
if err = pm .ReloadPools (); err != nil {
120
115
log .Err (err .Error ())
121
116
}
122
117
123
118
// Create a new retrieval service to prepare a data directory and start snapshotting.
124
- retrievalSvc , err := retrieval .New (cfg , engProps , docker , pm , tm , runner )
119
+ retrievalSvc , err := retrieval .New (cfg , & engProps , docker , pm , tm , runner )
125
120
if err != nil {
126
- log .Errf (errors .WithMessage (err , `error in the "retrieval" section of the config` ).Error ())
121
+ log .Errf (errors .WithMessage (err , `error in the "retrieval" section of config` ).Error ())
127
122
return
128
123
}
129
124
@@ -160,27 +155,34 @@ func main() {
160
155
161
156
go removeObservingClones (observingChan , obs )
162
157
158
+ systemMetrics := billing .GetSystemMetrics (pm )
159
+
163
160
tm .SendEvent (ctx , telemetry .EngineStartedEvent , telemetry.EngineStarted {
164
161
EngineVersion : version .GetVersion (),
165
162
DBEngine : cfg .Global .Engine ,
166
163
DBVersion : provisioner .DetectDBVersion (),
167
164
Pools : pm .CollectPoolStat (),
168
165
Restore : retrievalSvc .ReportState (),
169
- System : telemetry.System {
170
- CPU : runtime .NumCPU (),
171
- TotalMemory : memory .TotalMemory (),
172
- },
166
+ System : systemMetrics ,
173
167
})
174
168
169
+ billingSvc := billing .New (platformSvc .Client , & engProps , pm )
170
+
171
+ if err := billingSvc .RegisterInstance (ctx , systemMetrics ); err != nil {
172
+ log .Msg ("Skip registering instance:" , err )
173
+ }
174
+
175
+ log .Msg ("DLE Edition:" , engProps .GetEdition ())
176
+
175
177
embeddedUI := embeddedui .New (cfg .EmbeddedUI , engProps , runner , docker )
176
178
177
179
logCleaner := diagnostic .NewLogCleaner ()
178
180
179
181
reloadConfigFn := func (server * srv.Server ) error {
180
182
return reloadConfig (
181
183
ctx ,
184
+ engProps ,
182
185
provisioner ,
183
- tm ,
184
186
retrievalSvc ,
185
187
pm ,
186
188
cloningSvc ,
@@ -192,11 +194,13 @@ func main() {
192
194
)
193
195
}
194
196
195
- server := srv .NewServer (& cfg .Server , & cfg .Global , engProps , docker , cloningSvc , provisioner , retrievalSvc , platformSvc ,
196
- obs , pm , tm , tokenHolder , logFilter , embeddedUI , reloadConfigFn )
197
+ server := srv .NewServer (& cfg .Server , & cfg .Global , & engProps , docker , cloningSvc , provisioner , retrievalSvc , platformSvc ,
198
+ billingSvc , obs , pm , tm , tokenHolder , logFilter , embeddedUI , reloadConfigFn )
197
199
shutdownCh := setShutdownListener ()
198
200
199
- go setReloadListener (ctx , provisioner , tm , retrievalSvc , pm , cloningSvc , platformSvc , embeddedUI , server ,
201
+ go setReloadListener (ctx , engProps , provisioner ,
202
+ retrievalSvc , pm , cloningSvc , platformSvc ,
203
+ embeddedUI , server ,
200
204
logCleaner , logFilter )
201
205
202
206
server .InitHandlers ()
@@ -207,6 +211,8 @@ func main() {
207
211
}
208
212
}()
209
213
214
+ go billingSvc .CollectUsage (ctx , systemMetrics )
215
+
210
216
if cfg .EmbeddedUI .Enabled {
211
217
go func () {
212
218
if err := embeddedUI .Run (ctx ); err != nil {
@@ -245,13 +251,13 @@ func main() {
245
251
tm .SendEvent (ctxBackground , telemetry .EngineStoppedEvent , telemetry.EngineStopped {Uptime : server .Uptime ()})
246
252
}
247
253
248
- func getEngineProperties (ctx context.Context , dockerCLI * client.Client , cfg * config.Config ) (global.EngineProps , error ) {
254
+ func getEngineProperties (ctx context.Context , docker * client.Client , cfg * config.Config ) (global.EngineProps , error ) {
249
255
hostname := os .Getenv ("HOSTNAME" )
250
256
if hostname == "" {
251
257
return global.EngineProps {}, errors .New ("hostname is empty" )
252
258
}
253
259
254
- dleContainer , err := dockerCLI .ContainerInspect (ctx , hostname )
260
+ dleContainer , err := docker .ContainerInspect (ctx , hostname )
255
261
if err != nil {
256
262
return global.EngineProps {}, fmt .Errorf ("failed to inspect DLE container: %w" , err )
257
263
}
@@ -276,15 +282,15 @@ func getEngineProperties(ctx context.Context, dockerCLI *client.Client, cfg *con
276
282
return engProps , nil
277
283
}
278
284
279
- func reloadConfig (ctx context.Context , provisionSvc * provision. Provisioner , tm * telemetry. Agent ,
285
+ func reloadConfig (ctx context.Context , engProp global. EngineProps , provisionSvc * provision. Provisioner ,
280
286
retrievalSvc * retrieval.Retrieval , pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service ,
281
287
embeddedUI * embeddedui.UIManager , server * srv.Server , cleaner * diagnostic.Cleaner , filtering * log.Filtering ) error {
282
288
cfg , err := config .LoadConfiguration ()
283
289
if err != nil {
284
290
return err
285
291
}
286
292
287
- filtering .ReloadLogRegExp ([]string {cfg .Server .VerificationToken , cfg .Platform .AccessToken })
293
+ filtering .ReloadLogRegExp ([]string {cfg .Server .VerificationToken , cfg .Platform .AccessToken , cfg . Platform . OrgKey })
288
294
config .ApplyGlobals (cfg )
289
295
290
296
if err := provision .IsValidConfig (cfg .Provision ); err != nil {
@@ -296,7 +302,7 @@ func reloadConfig(ctx context.Context, provisionSvc *provision.Provisioner, tm *
296
302
return err
297
303
}
298
304
299
- newPlatformSvc , err := platform .New (ctx , cfg .Platform )
305
+ newPlatformSvc , err := platform .New (ctx , cfg .Platform , engProp . InstanceID )
300
306
if err != nil {
301
307
return err
302
308
}
@@ -319,7 +325,6 @@ func reloadConfig(ctx context.Context, provisionSvc *provision.Provisioner, tm *
319
325
}
320
326
321
327
provisionSvc .Reload (cfg .Provision , dbCfg )
322
- tm .Reload (cfg .Global )
323
328
retrievalSvc .Reload (ctx , newRetrievalConfig )
324
329
cloningSvc .Reload (cfg .Cloning )
325
330
platformSvc .Reload (newPlatformSvc )
@@ -328,7 +333,7 @@ func reloadConfig(ctx context.Context, provisionSvc *provision.Provisioner, tm *
328
333
return nil
329
334
}
330
335
331
- func setReloadListener (ctx context.Context , provisionSvc * provision. Provisioner , tm * telemetry. Agent ,
336
+ func setReloadListener (ctx context.Context , engProp global. EngineProps , provisionSvc * provision. Provisioner ,
332
337
retrievalSvc * retrieval.Retrieval , pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service ,
333
338
embeddedUI * embeddedui.UIManager , server * srv.Server , cleaner * diagnostic.Cleaner , logFilter * log.Filtering ) {
334
339
reloadCh := make (chan os.Signal , 1 )
@@ -337,7 +342,11 @@ func setReloadListener(ctx context.Context, provisionSvc *provision.Provisioner,
337
342
for range reloadCh {
338
343
log .Msg ("Reloading configuration" )
339
344
340
- if err := reloadConfig (ctx , provisionSvc , tm , retrievalSvc , pm , cloningSvc , platformSvc , embeddedUI , server ,
345
+ if err := reloadConfig (ctx , engProp ,
346
+ provisionSvc , retrievalSvc ,
347
+ pm , cloningSvc ,
348
+ platformSvc ,
349
+ embeddedUI , server ,
341
350
cleaner , logFilter ); err != nil {
342
351
log .Err ("Failed to reload configuration" , err )
343
352
}
0 commit comments