diff --git a/server/channels/app/metrics.go b/server/channels/app/metrics.go index 7bf8d2dc509..8d4863486c7 100644 --- a/server/channels/app/metrics.go +++ b/server/channels/app/metrics.go @@ -157,6 +157,8 @@ func (a *App) RegisterPerformanceReport(rctx request.CTX, report *model.Performa a.Metrics().ObserveDesktopCpuUsage(commonLabels["platform"], commonLabels["desktop_app_version"], h.Labels["process"], h.Value) case model.DesktopClientMemoryUsage: a.Metrics().ObserveDesktopMemoryUsage(commonLabels["platform"], commonLabels["desktop_app_version"], h.Labels["process"], h.Value/1000) + case model.PluginWebappPerf: + a.Metrics().ObservePluginWebappPerf(commonLabels["platform"], commonLabels["agent"], h.Labels["plugin_id"], h.Labels["plugin_metric_label"], h.Value) default: // we intentionally skip unknown metrics } diff --git a/server/einterfaces/metrics.go b/server/einterfaces/metrics.go index fa0b62845bb..6d03076ba2c 100644 --- a/server/einterfaces/metrics.go +++ b/server/einterfaces/metrics.go @@ -134,6 +134,7 @@ type MetricsInterface interface { ObserveMobileClientSessionMetadata(version string, platform string, value float64, notificationDisabled string) ObserveDesktopCpuUsage(platform, version, process string, usage float64) ObserveDesktopMemoryUsage(platform, version, process string, usage float64) + ObservePluginWebappPerf(platform, agent, pluginID, pluginMetricLabel string, elapsed float64) ObserveAccessControlSearchQueryDuration(value float64) ObserveAccessControlExpressionCompileDuration(value float64) diff --git a/server/einterfaces/mocks/MetricsInterface.go b/server/einterfaces/mocks/MetricsInterface.go index 23df185d382..610883b1161 100644 --- a/server/einterfaces/mocks/MetricsInterface.go +++ b/server/einterfaces/mocks/MetricsInterface.go @@ -528,6 +528,11 @@ func (_m *MetricsInterface) ObservePluginMultiHookIterationDuration(pluginID str _m.Called(pluginID, elapsed) } +// ObservePluginWebappPerf provides a mock function with given fields: platform, agent, pluginID, pluginMetricLabel, elapsed +func (_m *MetricsInterface) ObservePluginWebappPerf(platform string, agent string, pluginID string, pluginMetricLabel string, elapsed float64) { + _m.Called(platform, agent, pluginID, pluginMetricLabel, elapsed) +} + // ObservePostsSearchDuration provides a mock function with given fields: elapsed func (_m *MetricsInterface) ObservePostsSearchDuration(elapsed float64) { _m.Called(elapsed) diff --git a/server/enterprise/metrics/metrics.go b/server/enterprise/metrics/metrics.go index 22bffa026f5..ef58d6f312d 100644 --- a/server/enterprise/metrics/metrics.go +++ b/server/enterprise/metrics/metrics.go @@ -235,6 +235,8 @@ type MetricsInterfaceImpl struct { DesktopClientCPUUsage *prometheus.HistogramVec DesktopClientMemoryUsage *prometheus.HistogramVec + PluginWebappPerf *prometheus.HistogramVec + AccessControlExpressionCompileDuration prometheus.Histogram AccessControlEvaluateDuration prometheus.Histogram AccessControlSearchQueryDuration prometheus.Histogram @@ -1369,6 +1371,18 @@ func New(ps *platform.PlatformService, driver, dataSource string) *MetricsInterf ) m.Registry.MustRegister(m.ClientGlobalThreadsLoadDuration) + // Plugin webapp performance metrics + m.PluginWebappPerf = prometheus.NewHistogramVec( + withLabels(prometheus.HistogramOpts{ + Namespace: MetricsNamespace, + Subsystem: MetricsSubsystemPlugin, + Name: "webapp_perf", + Help: "Plugin webapp performance measurements", + }), + []string{"platform", "agent", "plugin_id", "plugin_metric_label"}, + ) + m.Registry.MustRegister(m.PluginWebappPerf) + m.MobileClientLoadDuration = prometheus.NewHistogramVec( withLabels(prometheus.HistogramOpts{ Namespace: MetricsNamespace, @@ -2202,6 +2216,15 @@ func (mi *MetricsInterfaceImpl) ObserveGlobalThreadsLoadDuration(platform, agent mi.ClientGlobalThreadsLoadDuration.With(prometheus.Labels{"platform": platform, "agent": agent, "user_id": effectiveUserID}).Observe(elapsed) } +func (mi *MetricsInterfaceImpl) ObservePluginWebappPerf(platform, agent, pluginID, pluginMetricLabel string, elapsed float64) { + mi.PluginWebappPerf.With(prometheus.Labels{ + "platform": platform, + "agent": agent, + "plugin_id": pluginID, + "plugin_metric_label": pluginMetricLabel, + }).Observe(elapsed) +} + func (mi *MetricsInterfaceImpl) ObserveDesktopCpuUsage(platform, version, process string, usage float64) { mi.DesktopClientCPUUsage.With(prometheus.Labels{"platform": platform, "version": version, "processName": process}).Observe(usage) } diff --git a/server/public/model/metrics.go b/server/public/model/metrics.go index 8dd0dc60ee8..4d422f5724e 100644 --- a/server/public/model/metrics.go +++ b/server/public/model/metrics.go @@ -44,6 +44,9 @@ const ( DesktopClientCPUUsage MetricType = "desktop_cpu" DesktopClientMemoryUsage MetricType = "desktop_memory" + // PluginWebappPerf is the metric type for plugin webapp performance metrics + PluginWebappPerf MetricType = "plugin_webapp_perf" + performanceReportTTLMilliseconds = 300 * 1000 // 300 seconds/5 minutes )