553 lines
13 KiB
Go
553 lines
13 KiB
Go
package osquery_perf
|
|
|
|
import (
|
|
"log"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type Stats struct {
|
|
StartTime time.Time
|
|
errors int
|
|
osqueryEnrollments int
|
|
orbitEnrollments int
|
|
mdmEnrollments int
|
|
mdmUserEnrollments int
|
|
mdmSessions int
|
|
mdmUserSessions int
|
|
mdmOnDemandSyncs int
|
|
distributedWrites int
|
|
mdmCommandsReceived int
|
|
mdmUserCommandsReceived int
|
|
mdmSCEPRequests int
|
|
mdmSCEPSuccess int
|
|
mdmSCEPErrors int
|
|
distributedReads int
|
|
configRequests int
|
|
configErrors int
|
|
resultLogRequests int
|
|
orbitErrors int
|
|
mdmErrors int
|
|
mdmUserErrors int
|
|
ddmTokensErrors int
|
|
ddmTokensSuccess int
|
|
ddmDeclarationItemsErrors int
|
|
ddmConfigurationErrors int
|
|
ddmActivationErrors int
|
|
ddmAssetErrors int
|
|
ddmStatusErrors int
|
|
ddmDeclarationItemsSuccess int
|
|
ddmConfigurationSuccess int
|
|
ddmActivationSuccess int
|
|
ddmAssetSuccess int
|
|
ddmStatusSuccess int
|
|
ddmUserTokensErrors int
|
|
ddmUserTokensSuccess int
|
|
ddmUserDeclarationItemsErrors int
|
|
ddmUserConfigurationErrors int
|
|
ddmUserActivationErrors int
|
|
ddmUserAssetErrors int
|
|
ddmUserStatusErrors int
|
|
ddmUserDeclarationItemsSuccess int
|
|
ddmUserConfigurationSuccess int
|
|
ddmUserActivationSuccess int
|
|
ddmUserAssetSuccess int
|
|
ddmUserStatusSuccess int
|
|
desktopErrors int
|
|
distributedReadErrors int
|
|
distributedWriteErrors int
|
|
resultLogErrors int
|
|
bufferedLogs int
|
|
scriptExecs int
|
|
scriptExecErrs int
|
|
softwareInstalls int
|
|
softwareInstallErrs int
|
|
androidEnrollments int
|
|
androidStatusReports int
|
|
androidCommandAcks int
|
|
androidCertVerifications int
|
|
androidErrors int
|
|
pssoRegistrations int
|
|
pssoLogins int
|
|
pssoKeyRequests int
|
|
pssoKeyExchanges int
|
|
pssoErrors int
|
|
|
|
l sync.Mutex
|
|
}
|
|
|
|
func (s *Stats) IncrementErrors(errors int) {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.errors += errors
|
|
}
|
|
|
|
func (s *Stats) IncrementEnrollments() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.osqueryEnrollments++
|
|
}
|
|
|
|
func (s *Stats) IncrementOrbitEnrollments() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.orbitEnrollments++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMEnrollments() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmEnrollments++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMUserEnrollments() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmUserEnrollments++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMSessions() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmSessions++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMUserSessions() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmUserSessions++
|
|
}
|
|
|
|
// IncrementMDMOnDemandSyncs counts Windows MDM sessions that were triggered by an on-demand wake
|
|
// (WindowsMDMSyncRequest) rather than the poll ticker. This is a subset of mdmSessions, not a separate total.
|
|
func (s *Stats) IncrementMDMOnDemandSyncs() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmOnDemandSyncs++
|
|
}
|
|
|
|
func (s *Stats) IncrementDistributedWrites() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.distributedWrites++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMCommandsReceived() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmCommandsReceived++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMUserCommandsReceived() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmUserCommandsReceived++
|
|
}
|
|
|
|
func (s *Stats) IncrementDistributedReads() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.distributedReads++
|
|
}
|
|
|
|
func (s *Stats) IncrementConfigRequests() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.configRequests++
|
|
}
|
|
|
|
func (s *Stats) IncrementConfigErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.configErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementResultLogRequests() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.resultLogRequests++
|
|
}
|
|
|
|
func (s *Stats) IncrementOrbitErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.orbitErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMUserErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmUserErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMSCEPRequests() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmSCEPRequests++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMSCEPSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmSCEPSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementMDMSCEPErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.mdmSCEPErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMTokensErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmTokensErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMTokensSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmTokensSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMDeclarationItemsErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmDeclarationItemsErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMConfigurationErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmConfigurationErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMActivationErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmActivationErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMAssetErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmAssetErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMStatusErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmStatusErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMDeclarationItemsSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmDeclarationItemsSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMConfigurationSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmConfigurationSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMActivationSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmActivationSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMAssetSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmAssetSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementDDMStatusSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmStatusSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMTokensErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserTokensErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMTokensSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserTokensSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMDeclarationItemsErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserDeclarationItemsErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMConfigurationErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserConfigurationErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMActivationErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserActivationErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMAssetErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserAssetErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMStatusErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserStatusErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMDeclarationItemsSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserDeclarationItemsSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMConfigurationSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserConfigurationSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMActivationSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserActivationSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMAssetSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserAssetSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementUserDDMStatusSuccess() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.ddmUserStatusSuccess++
|
|
}
|
|
|
|
func (s *Stats) IncrementDesktopErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.desktopErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDistributedReadErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.distributedReadErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementDistributedWriteErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.distributedWriteErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementResultLogErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.resultLogErrors++
|
|
}
|
|
|
|
func (s *Stats) UpdateBufferedLogs(v int) {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.bufferedLogs += v
|
|
if s.bufferedLogs < 0 {
|
|
s.bufferedLogs = 0
|
|
}
|
|
}
|
|
|
|
func (s *Stats) IncrementScriptExecs() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.scriptExecs++
|
|
}
|
|
|
|
func (s *Stats) IncrementScriptExecErrs() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.scriptExecErrs++
|
|
}
|
|
|
|
func (s *Stats) IncrementSoftwareInstalls() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.softwareInstalls++
|
|
}
|
|
|
|
func (s *Stats) IncrementSoftwareInstallErrs() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.softwareInstallErrs++
|
|
}
|
|
|
|
func (s *Stats) IncrementAndroidEnrollments() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.androidEnrollments++
|
|
}
|
|
|
|
func (s *Stats) IncrementAndroidStatusReports() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.androidStatusReports++
|
|
}
|
|
|
|
func (s *Stats) IncrementAndroidCommandAcks() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.androidCommandAcks++
|
|
}
|
|
|
|
func (s *Stats) IncrementAndroidCertVerifications() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.androidCertVerifications++
|
|
}
|
|
|
|
func (s *Stats) IncrementAndroidErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.androidErrors++
|
|
}
|
|
|
|
func (s *Stats) IncrementPSSORegistrations() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.pssoRegistrations++
|
|
}
|
|
|
|
func (s *Stats) IncrementPSSOLogins() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.pssoLogins++
|
|
}
|
|
|
|
func (s *Stats) IncrementPSSOKeyRequests() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.pssoKeyRequests++
|
|
}
|
|
|
|
func (s *Stats) IncrementPSSOKeyExchanges() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.pssoKeyExchanges++
|
|
}
|
|
|
|
func (s *Stats) IncrementPSSOErrors() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
s.pssoErrors++
|
|
}
|
|
|
|
func (s *Stats) Log() {
|
|
s.l.Lock()
|
|
defer s.l.Unlock()
|
|
|
|
var errorRate float64
|
|
if s.osqueryEnrollments > 0 {
|
|
errorRate = float64(s.errors) / float64(s.osqueryEnrollments)
|
|
}
|
|
|
|
log.Printf(
|
|
"uptime: %s, error rate: %.2f, osquery enrolls: %d, orbit enrolls: %d, mdm enrolls: %d, mdm user enrolls: %d, distributed/reads: %d, distributed/writes: %d, config requests: %d, result log requests: %d, mdm sessions initiated: %d, mdm user sessions initiated: %d, mdm on-demand syncs: %d, mdm commands received: %d, mdm user commands received: %d, config errors: %d, distributed/read errors: %d, distributed/write errors: %d, log result errors: %d, orbit errors: %d, desktop errors: %d, mdm errors: %d, mdm user errors: %d, mdm scep requests: %d, mdm scep success: %d, mdm scep errors: %d, ddm tokens success: %d, ddm user tokens success: %d, ddm tokens errors: %d, ddm user tokens errors: %d, ddm declaration items success: %d, ddm user declaration items success: %d, ddm declaration items errors: %d, ddm user declaration items errors: %d, ddm activation success: %d, ddm user activation success: %d, ddm activation errors: %d, ddm user activation errors: %d, ddm configuration success: %d, ddm user configuration success: %d, ddm configuration errors: %d, ddm user configuration errors: %d, ddm asset success: %d, ddm user asset success: %d, ddm asset errors: %d, ddm user asset errors: %d, ddm status success: %d, ddm user status success: %d, ddm status errors: %d, ddm user status errors: %d, buffered logs: %d, script execs (errs): %d (%d), software installs (errs): %d (%d), android enrolls: %d, android status reports: %d, android command acks: %d, android cert verifications: %d, android errors: %d, psso registrations: %d, psso logins: %d, psso key requests: %d, psso key exchanges: %d, psso errors: %d",
|
|
time.Since(s.StartTime).Round(time.Second),
|
|
errorRate,
|
|
s.osqueryEnrollments,
|
|
s.orbitEnrollments,
|
|
s.mdmEnrollments,
|
|
s.mdmUserEnrollments,
|
|
s.distributedReads,
|
|
s.distributedWrites,
|
|
s.configRequests,
|
|
s.resultLogRequests,
|
|
s.mdmSessions,
|
|
s.mdmUserSessions,
|
|
s.mdmOnDemandSyncs,
|
|
s.mdmCommandsReceived,
|
|
s.mdmUserCommandsReceived,
|
|
s.configErrors,
|
|
s.distributedReadErrors,
|
|
s.distributedWriteErrors,
|
|
s.resultLogErrors,
|
|
s.orbitErrors,
|
|
s.desktopErrors,
|
|
s.mdmErrors,
|
|
s.mdmUserErrors,
|
|
s.mdmSCEPRequests,
|
|
s.mdmSCEPSuccess,
|
|
s.mdmSCEPErrors,
|
|
s.ddmTokensSuccess,
|
|
s.ddmUserTokensSuccess,
|
|
s.ddmTokensErrors,
|
|
s.ddmUserTokensErrors,
|
|
s.ddmDeclarationItemsSuccess,
|
|
s.ddmUserDeclarationItemsSuccess,
|
|
s.ddmDeclarationItemsErrors,
|
|
s.ddmUserDeclarationItemsErrors,
|
|
s.ddmActivationSuccess,
|
|
s.ddmUserActivationSuccess,
|
|
s.ddmActivationErrors,
|
|
s.ddmUserActivationErrors,
|
|
s.ddmConfigurationSuccess,
|
|
s.ddmUserConfigurationSuccess,
|
|
s.ddmConfigurationErrors,
|
|
s.ddmUserConfigurationErrors,
|
|
s.ddmAssetSuccess,
|
|
s.ddmUserAssetSuccess,
|
|
s.ddmAssetErrors,
|
|
s.ddmUserAssetErrors,
|
|
s.ddmStatusSuccess,
|
|
s.ddmUserStatusSuccess,
|
|
s.ddmStatusErrors,
|
|
s.ddmUserStatusErrors,
|
|
s.bufferedLogs,
|
|
s.scriptExecs,
|
|
s.scriptExecErrs,
|
|
s.softwareInstalls,
|
|
s.softwareInstallErrs,
|
|
s.androidEnrollments,
|
|
s.androidStatusReports,
|
|
s.androidCommandAcks,
|
|
s.androidCertVerifications,
|
|
s.androidErrors,
|
|
s.pssoRegistrations,
|
|
s.pssoLogins,
|
|
s.pssoKeyRequests,
|
|
s.pssoKeyExchanges,
|
|
s.pssoErrors,
|
|
)
|
|
}
|
|
|
|
func (s *Stats) RunLoop() {
|
|
ticker := time.Tick(10 * time.Second)
|
|
for range ticker {
|
|
s.Log()
|
|
}
|
|
}
|