@@ -22,8 +22,10 @@ import (
22
22
"github.com/wavetermdev/waveterm/pkg/remote/fileshare/wshfs"
23
23
"github.com/wavetermdev/waveterm/pkg/service"
24
24
"github.com/wavetermdev/waveterm/pkg/telemetry"
25
+ "github.com/wavetermdev/waveterm/pkg/telemetry/telemetrydata"
25
26
"github.com/wavetermdev/waveterm/pkg/util/shellutil"
26
27
"github.com/wavetermdev/waveterm/pkg/util/sigutil"
28
+ "github.com/wavetermdev/waveterm/pkg/util/utilfn"
27
29
"github.com/wavetermdev/waveterm/pkg/wavebase"
28
30
"github.com/wavetermdev/waveterm/pkg/waveobj"
29
31
"github.com/wavetermdev/waveterm/pkg/wcloud"
@@ -46,6 +48,8 @@ var BuildTime = "0"
46
48
const InitialTelemetryWait = 10 * time .Second
47
49
const TelemetryTick = 2 * time .Minute
48
50
const TelemetryInterval = 4 * time .Hour
51
+ const TelemetryInitialCountsWait = 5 * time .Second
52
+ const TelemetryCountsInterval = 1 * time .Hour
49
53
50
54
var shutdownOnce sync.Once
51
55
@@ -82,7 +86,7 @@ func stdinReadWatch() {
82
86
}
83
87
}
84
88
85
- func configWatcher () {
89
+ func startConfigWatcher () {
86
90
watcher := wconfig .GetWatcher ()
87
91
if watcher != nil {
88
92
watcher .Start ()
@@ -101,32 +105,73 @@ func telemetryLoop() {
101
105
}
102
106
}
103
107
104
- func panicTelemetryHandler () {
108
+ func panicTelemetryHandler (panicName string ) {
105
109
activity := wshrpc.ActivityUpdate {NumPanics : 1 }
106
110
err := telemetry .UpdateActivity (context .Background (), activity )
107
111
if err != nil {
108
112
log .Printf ("error updating activity (panicTelemetryHandler): %v\n " , err )
109
113
}
114
+ telemetry .RecordTEvent (context .Background (), telemetrydata .MakeTEvent ("debug:panic" , telemetrydata.TEventProps {
115
+ PanicType : panicName ,
116
+ }))
110
117
}
111
118
112
119
func sendTelemetryWrapper () {
113
120
defer func () {
114
121
panichandler .PanicHandler ("sendTelemetryWrapper" , recover ())
115
122
}()
116
- ctx , cancelFn := context .WithTimeout (context .Background (), 5 * time .Second )
123
+ ctx , cancelFn := context .WithTimeout (context .Background (), 10 * time .Second )
117
124
defer cancelFn ()
118
125
beforeSendActivityUpdate (ctx )
119
126
client , err := wstore.DBGetSingleton [* waveobj.Client ](ctx )
120
127
if err != nil {
121
128
log .Printf ("[error] getting client data for telemetry: %v\n " , err )
122
129
return
123
130
}
124
- err = wcloud .SendTelemetry (ctx , client .OID )
131
+ err = wcloud .SendAllTelemetry (ctx , client .OID )
125
132
if err != nil {
126
133
log .Printf ("[error] sending telemetry: %v\n " , err )
127
134
}
128
135
}
129
136
137
+ func updateTelemetryCounts (lastCounts telemetrydata.TEventProps ) telemetrydata.TEventProps {
138
+ ctx , cancelFn := context .WithTimeout (context .Background (), 5 * time .Second )
139
+ defer cancelFn ()
140
+ var props telemetrydata.TEventProps
141
+ props .CountBlocks , _ = wstore.DBGetCount [* waveobj.Block ](ctx )
142
+ props .CountTabs , _ = wstore.DBGetCount [* waveobj.Tab ](ctx )
143
+ props .CountWindows , _ = wstore.DBGetCount [* waveobj.Window ](ctx )
144
+ props .CountWorkspaces , _ , _ = wstore .DBGetWSCounts (ctx )
145
+ props .CountSSHConn = conncontroller .GetNumSSHHasConnected ()
146
+ props .CountWSLConn = wslconn .GetNumWSLHasConnected ()
147
+ props .CountViews , _ = wstore .DBGetBlockViewCounts (ctx )
148
+ if utilfn .CompareAsMarshaledJson (props , lastCounts ) {
149
+ return lastCounts
150
+ }
151
+ tevent := telemetrydata .MakeTEvent ("app:counts" , props )
152
+ err := telemetry .RecordTEvent (ctx , tevent )
153
+ if err != nil {
154
+ log .Printf ("error recording counts tevent: %v\n " , err )
155
+ }
156
+ return props
157
+ }
158
+
159
+ func updateTelemetryCountsLoop () {
160
+ defer func () {
161
+ panichandler .PanicHandler ("updateTelemetryCountsLoop" , recover ())
162
+ }()
163
+ var nextSend int64
164
+ var lastCounts telemetrydata.TEventProps
165
+ time .Sleep (TelemetryInitialCountsWait )
166
+ for {
167
+ if time .Now ().Unix () > nextSend {
168
+ nextSend = time .Now ().Add (TelemetryCountsInterval ).Unix ()
169
+ lastCounts = updateTelemetryCounts (lastCounts )
170
+ }
171
+ time .Sleep (TelemetryTick )
172
+ }
173
+ }
174
+
130
175
func beforeSendActivityUpdate (ctx context.Context ) {
131
176
activity := wshrpc.ActivityUpdate {}
132
177
activity .NumTabs , _ = wstore.DBGetCount [* waveobj.Tab ](ctx )
@@ -150,6 +195,26 @@ func startupActivityUpdate() {
150
195
if err != nil {
151
196
log .Printf ("error updating startup activity: %v\n " , err )
152
197
}
198
+ autoUpdateChannel := telemetry .AutoUpdateChannel ()
199
+ autoUpdateEnabled := telemetry .IsAutoUpdateEnabled ()
200
+ tevent := telemetrydata .MakeTEvent ("app:startup" , telemetrydata.TEventProps {
201
+ UserSet : & telemetrydata.TEventUserProps {
202
+ ClientVersion : "v" + WaveVersion ,
203
+ ClientBuildTime : BuildTime ,
204
+ ClientArch : wavebase .ClientArch (),
205
+ ClientOSRelease : wavebase .UnameKernelRelease (),
206
+ ClientIsDev : wavebase .IsDevMode (),
207
+ AutoUpdateChannel : autoUpdateChannel ,
208
+ AutoUpdateEnabled : autoUpdateEnabled ,
209
+ },
210
+ UserSetOnce : & telemetrydata.TEventUserProps {
211
+ ClientInitialVersion : "v" + WaveVersion ,
212
+ },
213
+ })
214
+ err = telemetry .RecordTEvent (ctx , tevent )
215
+ if err != nil {
216
+ log .Printf ("error recording startup event: %v\n " , err )
217
+ }
153
218
}
154
219
155
220
func shutdownActivityUpdate () {
@@ -160,6 +225,15 @@ func shutdownActivityUpdate() {
160
225
if err != nil {
161
226
log .Printf ("error updating shutdown activity: %v\n " , err )
162
227
}
228
+ err = telemetry .TruncateActivityTEventForShutdown (ctx )
229
+ if err != nil {
230
+ log .Printf ("error truncating activity t-event for shutdown: %v\n " , err )
231
+ }
232
+ tevent := telemetrydata .MakeTEvent ("app:shutdown" , telemetrydata.TEventProps {})
233
+ err = telemetry .RecordTEvent (ctx , tevent )
234
+ if err != nil {
235
+ log .Printf ("error recording shutdown event: %v\n " , err )
236
+ }
163
237
}
164
238
165
239
func createMainWshClient () {
@@ -283,15 +357,15 @@ func main() {
283
357
}
284
358
285
359
createMainWshClient ()
286
-
287
360
sigutil .InstallShutdownSignalHandlers (doShutdown )
288
361
sigutil .InstallSIGUSR1Handler ()
289
-
290
- startupActivityUpdate ()
362
+ startConfigWatcher ()
291
363
go stdinReadWatch ()
292
364
go telemetryLoop ()
293
- configWatcher ()
365
+ go updateTelemetryCountsLoop ()
366
+ startupActivityUpdate () // must be after startConfigWatcher()
294
367
blocklogger .InitBlockLogger ()
368
+
295
369
webListener , err := web .MakeTCPListener ("web" )
296
370
if err != nil {
297
371
log .Printf ("error creating web listener: %v\n " , err )
0 commit comments