[MM-60609][MM-60612] Include Desktop App metrics in PerformanceReporter, add metrics in Prometheus for CPU/Memory usage (#28825)
* [MM-60609][MM-60612] Include Desktop App metrics in PerformanceReporter, add metrics in Prometheus for CPU/Memory usage * Fix mocks * PR feedback
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
2d96053012
Коммит
0c90b0363b
@@ -72,6 +72,10 @@ func (a *App) RegisterPerformanceReport(rctx request.CTX, report *model.Performa
|
||||
a.Metrics().ObserveMobileClientChannelSwitchDuration(commonLabels["platform"], h.Value/1000)
|
||||
case model.MobileClientTeamSwitchDuration:
|
||||
a.Metrics().ObserveMobileClientTeamSwitchDuration(commonLabels["platform"], h.Value/1000)
|
||||
case model.DesktopClientCPUUsage:
|
||||
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)
|
||||
default:
|
||||
// we intentionally skip unknown metrics
|
||||
}
|
||||
|
||||
@@ -120,4 +120,6 @@ type MetricsInterface interface {
|
||||
ObserveMobileClientTeamSwitchDuration(platform string, elapsed float64)
|
||||
ClearMobileClientSessionMetadata()
|
||||
ObserveMobileClientSessionMetadata(version string, platform string, value float64, notificationDisabled string)
|
||||
ObserveDesktopCpuUsage(platform, version, process string, usage float64)
|
||||
ObserveDesktopMemoryUsage(platform, version, process string, usage float64)
|
||||
}
|
||||
|
||||
@@ -353,6 +353,16 @@ func (_m *MetricsInterface) ObserveClusterRequestDuration(elapsed float64) {
|
||||
_m.Called(elapsed)
|
||||
}
|
||||
|
||||
// ObserveDesktopCpuUsage provides a mock function with given fields: platform, version, process, usage
|
||||
func (_m *MetricsInterface) ObserveDesktopCpuUsage(platform string, version string, process string, usage float64) {
|
||||
_m.Called(platform, version, process, usage)
|
||||
}
|
||||
|
||||
// ObserveDesktopMemoryUsage provides a mock function with given fields: platform, version, process, usage
|
||||
func (_m *MetricsInterface) ObserveDesktopMemoryUsage(platform string, version string, process string, usage float64) {
|
||||
_m.Called(platform, version, process, usage)
|
||||
}
|
||||
|
||||
// ObserveEnabledUsers provides a mock function with given fields: users
|
||||
func (_m *MetricsInterface) ObserveEnabledUsers(users int64) {
|
||||
_m.Called(users)
|
||||
|
||||
@@ -44,6 +44,7 @@ const (
|
||||
MetricsSubsystemNotifications = "notifications"
|
||||
MetricsSubsystemClientsMobileApp = "mobileapp"
|
||||
MetricsSubsystemClientsWeb = "webapp"
|
||||
MetricsSubsystemClientsDesktopApp = "desktopapp"
|
||||
MetricsCloudInstallationLabel = "installationId"
|
||||
MetricsCloudDatabaseClusterLabel = "databaseClusterName"
|
||||
MetricsCloudInstallationGroupLabel = "installationGroupId"
|
||||
@@ -216,6 +217,9 @@ type MetricsInterfaceImpl struct {
|
||||
MobileClientChannelSwitchDuration *prometheus.HistogramVec
|
||||
MobileClientTeamSwitchDuration *prometheus.HistogramVec
|
||||
MobileClientSessionMetadataGauge *prometheus.GaugeVec
|
||||
|
||||
DesktopClientCPUUsage *prometheus.HistogramVec
|
||||
DesktopClientMemoryUsage *prometheus.HistogramVec
|
||||
}
|
||||
|
||||
func init() {
|
||||
@@ -1347,6 +1351,30 @@ func New(ps *platform.PlatformService, driver, dataSource string) *MetricsInterf
|
||||
)
|
||||
m.Registry.MustRegister(m.MobileClientSessionMetadataGauge)
|
||||
|
||||
m.DesktopClientCPUUsage = prometheus.NewHistogramVec(
|
||||
prometheus.HistogramOpts{
|
||||
Namespace: MetricsNamespace,
|
||||
Subsystem: MetricsSubsystemClientsDesktopApp,
|
||||
Name: "cpu_usage",
|
||||
Help: "Average CPU usage of a specific process over an interval",
|
||||
Buckets: []float64{0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 80, 100},
|
||||
},
|
||||
[]string{"platform", "version", "processName"},
|
||||
)
|
||||
m.Registry.MustRegister(m.DesktopClientCPUUsage)
|
||||
|
||||
m.DesktopClientMemoryUsage = prometheus.NewHistogramVec(
|
||||
prometheus.HistogramOpts{
|
||||
Namespace: MetricsNamespace,
|
||||
Subsystem: MetricsSubsystemClientsDesktopApp,
|
||||
Name: "memory_usage",
|
||||
Help: "Memory usage in MB of a specific process",
|
||||
Buckets: []float64{0, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 3000, 5000},
|
||||
},
|
||||
[]string{"platform", "version", "processName"},
|
||||
)
|
||||
m.Registry.MustRegister(m.DesktopClientMemoryUsage)
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
@@ -1850,6 +1878,14 @@ func (mi *MetricsInterfaceImpl) ObserveGlobalThreadsLoadDuration(platform, agent
|
||||
mi.ClientGlobalThreadsLoadDuration.With(prometheus.Labels{"platform": platform, "agent": agent}).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)
|
||||
}
|
||||
|
||||
func (mi *MetricsInterfaceImpl) ObserveDesktopMemoryUsage(platform, version, process string, usage float64) {
|
||||
mi.DesktopClientMemoryUsage.With(prometheus.Labels{"platform": platform, "version": version, "processName": process}).Observe(usage)
|
||||
}
|
||||
|
||||
func (mi *MetricsInterfaceImpl) ObserveMobileClientLoadDuration(platform string, elapsed float64) {
|
||||
mi.MobileClientLoadDuration.With(prometheus.Labels{"platform": platform}).Observe(elapsed)
|
||||
}
|
||||
|
||||
@@ -30,6 +30,9 @@ const (
|
||||
MobileClientChannelSwitchDuration MetricType = "mobile_channel_switch"
|
||||
MobileClientTeamSwitchDuration MetricType = "mobile_team_switch"
|
||||
|
||||
DesktopClientCPUUsage MetricType = "desktop_cpu"
|
||||
DesktopClientMemoryUsage MetricType = "desktop_memory"
|
||||
|
||||
performanceReportTTLMilliseconds = 300 * 1000 // 300 seconds/5 minutes
|
||||
)
|
||||
|
||||
@@ -104,8 +107,9 @@ func (r *PerformanceReport) IsValid() error {
|
||||
|
||||
func (r *PerformanceReport) ProcessLabels() map[string]string {
|
||||
return map[string]string{
|
||||
"platform": processLabel(r.Labels, "platform", acceptedPlatforms, "other"),
|
||||
"agent": processLabel(r.Labels, "agent", acceptedAgents, "other"),
|
||||
"platform": processLabel(r.Labels, "platform", acceptedPlatforms, "other"),
|
||||
"agent": processLabel(r.Labels, "agent", acceptedAgents, "other"),
|
||||
"desktop_app_version": r.Labels["desktop_app_version"],
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user