diff --git a/app/plugin_hooks_test.go b/app/plugin_hooks_test.go index f251822685..5d8cbcb5ff 100644 --- a/app/plugin_hooks_test.go +++ b/app/plugin_hooks_test.go @@ -1259,3 +1259,46 @@ func TestHookRunDataRetention(t *testing.T) { require.True(t, hookCalled) } + +func TestHookOnSendDailyTelemetry(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + + tearDown, pluginIDs, _ := SetAppEnvironmentWithPlugins(t, + []string{ + ` + package main + + import ( + "github.com/mattermost/mattermost-server/v6/plugin" + ) + + type MyPlugin struct { + plugin.MattermostPlugin + } + + func (p *MyPlugin) OnSendDailyTelemetry() { + return + } + + func main() { + plugin.ClientMain(&MyPlugin{}) + } + `}, th.App, th.NewPluginAPI) + defer tearDown() + + require.Len(t, pluginIDs, 1) + pluginID := pluginIDs[0] + + require.True(t, th.App.GetPluginsEnvironment().IsActive(pluginID)) + + hookCalled := false + th.App.GetPluginsEnvironment().RunMultiPluginHook(func(hooks plugin.Hooks) bool { + hooks.OnSendDailyTelemetry() + + hookCalled = true + return hookCalled + }, plugin.OnSendDailyTelemetryID) + + require.True(t, hookCalled) +} diff --git a/plugin/client_rpc_generated.go b/plugin/client_rpc_generated.go index 5ab31c3c46..72b3838b18 100644 --- a/plugin/client_rpc_generated.go +++ b/plugin/client_rpc_generated.go @@ -742,6 +742,38 @@ func (s *hooksRPCServer) OnInstall(args *Z_OnInstallArgs, returns *Z_OnInstallRe return nil } +func init() { + hookNameToId["OnSendDailyTelemetry"] = OnSendDailyTelemetryID +} + +type Z_OnSendDailyTelemetryArgs struct { +} + +type Z_OnSendDailyTelemetryReturns struct { +} + +func (g *hooksRPCClient) OnSendDailyTelemetry() { + _args := &Z_OnSendDailyTelemetryArgs{} + _returns := &Z_OnSendDailyTelemetryReturns{} + if g.implemented[OnSendDailyTelemetryID] { + if err := g.client.Call("Plugin.OnSendDailyTelemetry", _args, _returns); err != nil { + g.log.Error("RPC call OnSendDailyTelemetry to plugin failed.", mlog.Err(err)) + } + } + +} + +func (s *hooksRPCServer) OnSendDailyTelemetry(args *Z_OnSendDailyTelemetryArgs, returns *Z_OnSendDailyTelemetryReturns) error { + if hook, ok := s.impl.(interface { + OnSendDailyTelemetry() + }); ok { + hook.OnSendDailyTelemetry() + } else { + return encodableError(fmt.Errorf("Hook OnSendDailyTelemetry called but not implemented.")) + } + return nil +} + type Z_RegisterCommandArgs struct { A *model.Command } diff --git a/plugin/hooks.go b/plugin/hooks.go index f220004c32..266e3fba9f 100644 --- a/plugin/hooks.go +++ b/plugin/hooks.go @@ -41,6 +41,7 @@ const ( WebSocketMessageHasBeenPostedID = 23 RunDataRetentionID = 24 OnInstallID = 25 + OnSendDailyTelemetryID = 26 TotalHooksID = iota ) @@ -246,7 +247,7 @@ type Hooks interface { // Minimum server version: 6.0 WebSocketMessageHasBeenPosted(webConnID, userID string, req *model.WebSocketRequest) - // RunDataRetention is invoked during a DataRetentionJob + // RunDataRetention is invoked during a DataRetentionJob. // // Minimum server version: 6.4 RunDataRetention(nowTime, batchSize int64) (int64, error) @@ -258,4 +259,9 @@ type Hooks interface { // // Minimum server version: 6.5 OnInstall(c *Context, event model.OnInstallEvent) error + + // OnSendDailyTelemetry is invoked when the server send the daily telemtry data. + // + // Minimum server version: 6.5 + OnSendDailyTelemetry() } diff --git a/plugin/hooks_timer_layer_generated.go b/plugin/hooks_timer_layer_generated.go index 28e5a790a2..527862e8f5 100644 --- a/plugin/hooks_timer_layer_generated.go +++ b/plugin/hooks_timer_layer_generated.go @@ -200,3 +200,9 @@ func (hooks *hooksTimerLayer) OnInstall(c *Context, event model.OnInstallEvent) hooks.recordTime(startTime, "OnInstall", _returnsA == nil) return _returnsA } + +func (hooks *hooksTimerLayer) OnSendDailyTelemetry() { + startTime := timePkg.Now() + hooks.hooksImpl.OnSendDailyTelemetry() + hooks.recordTime(startTime, "OnSendDailyTelemetry", true) +} diff --git a/plugin/plugintest/hooks.go b/plugin/plugintest/hooks.go index 50a5e02a3f..3dcbea85b8 100644 --- a/plugin/plugintest/hooks.go +++ b/plugin/plugintest/hooks.go @@ -213,6 +213,11 @@ func (_m *Hooks) OnPluginClusterEvent(c *plugin.Context, ev model.PluginClusterE _m.Called(c, ev) } +// OnSendDailyTelemetry provides a mock function with given fields: +func (_m *Hooks) OnSendDailyTelemetry() { + _m.Called() +} + // OnWebSocketConnect provides a mock function with given fields: webConnID, userID func (_m *Hooks) OnWebSocketConnect(webConnID string, userID string) { _m.Called(webConnID, userID) diff --git a/services/telemetry/telemetry.go b/services/telemetry/telemetry.go index dad61b6dea..5157c9cc81 100644 --- a/services/telemetry/telemetry.go +++ b/services/telemetry/telemetry.go @@ -902,6 +902,11 @@ func (ts *TelemetryService) trackPlugins() { "plugins_with_settings": settingsCount, "plugins_with_broken_manifests": brokenManifestCount, }) + + pluginsEnvironment.RunMultiPluginHook(func(hooks plugin.Hooks) bool { + hooks.OnSendDailyTelemetry() + return true + }, plugin.OnSendDailyTelemetryID) } func (ts *TelemetryService) trackServer() {