func init() { collectors = append(collectors, &IntervalCollector{F: c_network_windows, init: winNetworkInit}) c_winnetteam := &IntervalCollector{ F: c_network_team_windows, } // Make sure MSFT_NetImPlatAdapter and MSFT_NetAdapterStatisticsSettingData // are valid WMI classes when initializing c_network_team_windows c_winnetteam.init = func() { var dstTeamNic []MSFT_NetLbfoTeamNic var dstStats []MSFT_NetAdapterStatisticsSettingData queryTeamAdapter = wmi.CreateQuery(&dstTeamNic, "") queryTeamStats = wmi.CreateQuery(&dstStats, "") c_winnetteam.Enable = func() bool { errTeamNic := queryWmiNamespace(queryTeamAdapter, &dstTeamNic, namespaceStandardCimv2) errStats := queryWmiNamespace(queryTeamStats, &dstStats, namespaceStandardCimv2) result := errTeamNic == nil && errStats == nil return result } } collectors = append(collectors, c_winnetteam) c := &IntervalCollector{ F: c_network_windows_tcp, } c.init = wmiInit(c, func() interface{} { return &[]Win32_PerfRawData_Tcpip_TCPv4{} }, "", &winNetTCPQuery) collectors = append(collectors, c) }
func metaWindowsIfaces() { var dstConfigs []Win32_NetworkAdapterConfiguration q := wmi.CreateQuery(&dstConfigs, "WHERE MACAddress != null") err := wmi.Query(q, &dstConfigs) if err != nil { slog.Error(err) return } mNicConfigs := make(map[uint32]*Win32_NetworkAdapterConfiguration) for i, nic := range dstConfigs { mNicConfigs[nic.InterfaceIndex] = &dstConfigs[i] } mNicTeamIDtoSpeed := make(map[string]uint64) mNicTeamIDtoMaster := make(map[string]string) var dstTeamMembers []MSFT_NetLbfoTeamMember q = wmi.CreateQuery(&dstTeamMembers, "") err = wmi.QueryNamespace(q, &dstTeamMembers, "root\\StandardCimv2") if err == nil { for _, teamMember := range dstTeamMembers { mNicTeamIDtoSpeed[teamMember.InstanceID] = teamMember.ReceiveLinkSpeed mNicTeamIDtoMaster[teamMember.InstanceID] = teamMember.Team } } var dstAdapters []Win32_NetworkAdapter q = wmi.CreateQuery(&dstAdapters, "WHERE PhysicalAdapter=True and MACAddress <> null and NetConnectionStatus = 2") //Only adapters with MAC addresses and status="Connected" err = wmi.Query(q, &dstAdapters) if err != nil { slog.Error(err) return } for _, v := range dstAdapters { tag := opentsdb.TagSet{"iface": fmt.Sprint("Interface", v.InterfaceIndex)} AddMeta("", tag, "description", v.Description, true) AddMeta("", tag, "name", v.NetConnectionID, true) AddMeta("", tag, "mac", strings.Replace(v.MACAddress, ":", "", -1), true) if v.Speed != nil && *v.Speed != 0 { AddMeta("", tag, "speed", v.Speed, true) } else { nicSpeed := mNicTeamIDtoSpeed[v.GUID] AddMeta("", tag, "speed", nicSpeed, true) } nicMaster := mNicTeamIDtoMaster[v.GUID] if nicMaster != "" { AddMeta("", tag, "master", nicMaster, true) } nicConfig := mNicConfigs[v.InterfaceIndex] if nicConfig != nil { for _, ip := range *nicConfig.IPAddress { AddMeta("", tag, "addr", ip, true) // blocked by array support in WMI See https://github.com/StackExchange/wmi/issues/5 } } } }
func c_windows_memory() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_PerfOS_Memory var q = wmi.CreateQuery(&dst, "") err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { Add(&md, "win.mem.cache", v.CacheBytes, nil, metadata.Gauge, metadata.Bytes, descWinMemCacheBytes) Add(&md, "win.mem.cache_peak", v.CacheBytesPeak, nil, metadata.Gauge, metadata.Bytes, descWinMemCacheBytesPeak) Add(&md, "win.mem.committed", v.CommittedBytes, nil, metadata.Gauge, metadata.Bytes, descWinMemCommittedBytes) Add(&md, "win.mem.committed_limit", v.CommitLimit, nil, metadata.Gauge, metadata.Bytes, descWinMemCommitLimit) Add(&md, "win.mem.committed_percent", float64(v.PercentCommittedBytesInUse)/float64(v.PercentCommittedBytesInUse_Base)*100, nil, metadata.Gauge, metadata.Pct, descWinMemPercentCommittedBytesInUse) Add(&md, "win.mem.modified", v.ModifiedPageListBytes, nil, metadata.Gauge, metadata.Bytes, descWinMemModifiedPageListBytes) Add(&md, "win.mem.page_faults", v.PageFaultsPersec, nil, metadata.Counter, metadata.PerSecond, descWinMemPageFaultsPersec) Add(&md, "win.mem.faults", v.CacheFaultsPersec, opentsdb.TagSet{"type": "cache"}, metadata.Counter, metadata.PerSecond, descWinMemCacheFaultsPersec) Add(&md, "win.mem.faults", v.DemandZeroFaultsPersec, opentsdb.TagSet{"type": "demand_zero"}, metadata.Counter, metadata.PerSecond, descWinMemDemandZeroFaultsPersec) Add(&md, "win.mem.faults", v.TransitionFaultsPersec, opentsdb.TagSet{"type": "transition"}, metadata.Counter, metadata.PerSecond, descWinMemTransitionFaultsPersec) Add(&md, "win.mem.faults", v.WriteCopiesPersec, opentsdb.TagSet{"type": "write_copies"}, metadata.Counter, metadata.PerSecond, descWinMemWriteCopiesPersec) Add(&md, "win.mem.page_operations", v.PageReadsPersec, opentsdb.TagSet{"type": "read"}, metadata.Counter, metadata.PerSecond, descWinMemPageReadsPersec) Add(&md, "win.mem.page_operations", v.PageWritesPersec, opentsdb.TagSet{"type": "write"}, metadata.Counter, metadata.PerSecond, descWinMemPageWritesPersec) Add(&md, "win.mem.page_operations", v.PagesInputPersec, opentsdb.TagSet{"type": "input"}, metadata.Counter, metadata.PerSecond, descWinMemPagesInputPersec) Add(&md, "win.mem.page_operations", v.PagesOutputPersec, opentsdb.TagSet{"type": "output"}, metadata.Counter, metadata.PerSecond, descWinMemPagesOutputPersec) Add(&md, "win.mem.pool.bytes", v.PoolNonpagedBytes, opentsdb.TagSet{"type": "nonpaged"}, metadata.Gauge, metadata.Bytes, descWinMemPoolNonpagedBytes) Add(&md, "win.mem.pool.bytes", v.PoolPagedBytes, opentsdb.TagSet{"type": "paged"}, metadata.Gauge, metadata.Bytes, descWinMemPoolPagedBytes) Add(&md, "win.mem.pool.bytes", v.PoolPagedResidentBytes, opentsdb.TagSet{"type": "paged_resident"}, metadata.Gauge, metadata.Bytes, descWinMemPoolPagedResidentBytes) Add(&md, "win.mem.pool.allocations", v.PoolPagedAllocs, opentsdb.TagSet{"type": "paged"}, metadata.Gauge, metadata.Operation, descWinMemPoolPagedAllocs) Add(&md, "win.mem.pool.allocations", v.PoolNonpagedAllocs, opentsdb.TagSet{"type": "nonpaged"}, metadata.Gauge, metadata.Operation, descWinMemPoolNonpagedAllocs) } return md, nil }
func c_diskspace_windows() (opentsdb.MultiDataPoint, error) { var dst []Win32_LogicalDisk var q = wmi.CreateQuery(&dst, "WHERE DriveType = 3 AND FreeSpace <> null") err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { tags := opentsdb.TagSet{"disk": v.Name} space_used := v.Size - v.FreeSpace Add(&md, "win.disk.fs.space_free", v.FreeSpace, tags, metadata.Gauge, metadata.Bytes, osDiskFreeDesc) Add(&md, "win.disk.fs.space_total", v.Size, tags, metadata.Gauge, metadata.Bytes, osDiskTotalDesc) Add(&md, "win.disk.fs.space_used", space_used, tags, metadata.Gauge, metadata.Bytes, osDiskUsedDesc) Add(&md, osDiskFree, v.FreeSpace, tags, metadata.Gauge, metadata.Bytes, osDiskFreeDesc) Add(&md, osDiskTotal, v.Size, tags, metadata.Gauge, metadata.Bytes, osDiskTotalDesc) Add(&md, osDiskUsed, space_used, tags, metadata.Gauge, metadata.Bytes, osDiskUsedDesc) if v.Size != 0 { percent_free := float64(v.FreeSpace) / float64(v.Size) * 100 Add(&md, "win.disk.fs.percent_free", percent_free, tags, metadata.Gauge, metadata.Pct, osDiskPctFreeDesc) Add(&md, osDiskPctFree, percent_free, tags, metadata.Gauge, metadata.Pct, osDiskPctFreeDesc) } if v.VolumeName != "" { metadata.AddMeta("", tags, "label", v.VolumeName, true) } } return md, nil }
func wmiInitNamespace(c *IntervalCollector, dst func() interface{}, where string, query *string, namespace string) func() { return func() { *query = wmi.CreateQuery(dst(), where) c.Enable = func() bool { return queryWmiNamespace(*query, dst(), namespace) == nil } } }
// winNetworkInit maintains a mapping of InstanceName to InterfaceIndex func winNetworkInit() { update := func() { var dstNetworkAdapter []Win32_NetworkAdapter q := wmi.CreateQuery(&dstNetworkAdapter, "WHERE PhysicalAdapter=True and MACAddress <> null") err := queryWmi(q, &dstNetworkAdapter) if err != nil { slog.Error(err) return } for _, nic := range dstNetworkAdapter { var iface = fmt.Sprint("Interface", nic.InterfaceIndex) // Get PnPName using Win32_PnPEntity class var pnpname = "" var escapeddeviceid = strings.Replace(nic.PNPDeviceID, "\\", "\\\\", -1) var filter = fmt.Sprintf("WHERE DeviceID='%s'", escapeddeviceid) var dstPnPName []Win32_PnPEntity q = wmi.CreateQuery(&dstPnPName, filter) err = queryWmi(q, &dstPnPName) if err != nil { slog.Error(err) return } for _, pnp := range dstPnPName { // Really should be a single item pnpname = pnp.Name } if pnpname == "" { slog.Errorf("%s cannot find Win32_PnPEntity %s", iface, filter) continue } // Convert to instance name (see http://goo.gl/jfq6pq ) instanceName := winNetworkToInstanceName(pnpname) mNicInstanceNameToInterfaceIndex[instanceName] = iface } } update() go func() { for range time.Tick(time.Minute * 5) { update() } }() }
func c_meta_windows_version() (opentsdb.MultiDataPoint, error) { var md opentsdb.MultiDataPoint var dst []Win32_OperatingSystem q := wmi.CreateQuery(&dst, "") err := wmi.Query(q, &dst) if err != nil { slog.Error(err) return md, err } var dstComputer []Win32_ComputerSystem q = wmi.CreateQuery(&dstComputer, "") err = wmi.Query(q, &dstComputer) if err != nil { slog.Error(err) return md, err } var dstBIOS []Win32_BIOS q = wmi.CreateQuery(&dstBIOS, "") err = wmi.Query(q, &dstBIOS) if err != nil { slog.Error(err) return md, err } for _, v := range dst { metadata.AddMeta("", nil, "version", v.Version, true) metadata.AddMeta("", nil, "versionCaption", v.Caption, true) } for _, v := range dstComputer { metadata.AddMeta("", nil, "manufacturer", v.Manufacturer, true) metadata.AddMeta("", nil, "model", v.Model, true) metadata.AddMeta("", nil, "memoryTotal", v.TotalPhysicalMemory, true) } for _, v := range dstBIOS { metadata.AddMeta("", nil, "serialNumber", v.SerialNumber, true) } return md, nil }
func metaWindowsVersion() { var dst []Win32_OperatingSystem q := wmi.CreateQuery(&dst, "") err := wmi.Query(q, &dst) if err != nil { slog.Error(err) return } var dstComputer []Win32_ComputerSystem q = wmi.CreateQuery(&dstComputer, "") err = wmi.Query(q, &dstComputer) if err != nil { slog.Error(err) return } var dstBIOS []Win32_BIOS q = wmi.CreateQuery(&dstBIOS, "") err = wmi.Query(q, &dstBIOS) if err != nil { slog.Error(err) return } for _, v := range dst { AddMeta("", nil, "version", v.Version, true) AddMeta("", nil, "versionCaption", v.Caption, true) } for _, v := range dstComputer { AddMeta("", nil, "manufacturer", v.Manufacturer, true) AddMeta("", nil, "model", v.Model, true) AddMeta("", nil, "memoryTotal", v.TotalPhysicalMemory, true) } for _, v := range dstBIOS { AddMeta("", nil, "serialNumber", v.SerialNumber, true) } }
func c_windows_process_total() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_PerfProc_Process var q = wmi.CreateQuery(&dst, `WHERE Name = '_Total'`) err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { Add(&md, "win.system.handle_count", v.HandleCount, nil, metadata.Gauge, metadata.Count, descWinSystemHandle_count) } return md, nil }
func c_mssql_replica_resources() (opentsdb.MultiDataPoint, error) { var dst []MSCluster_Resource //Only report metrics for resources owned by this node var q = wmi.CreateQuery(&dst, fmt.Sprintf("WHERE OwnerNode = '%s'", util.Hostname)) if err := queryWmiNamespace(q, &dst, rootMSCluster); err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { Add(&md, "mssql.replica.resource_state", v.State, opentsdb.TagSet{"group": v.OwnerGroup, "type": v.Type, "name": v.Name}, metadata.Gauge, metadata.StatusCode, descMSSQLReplicaResourceState) } return md, nil }
func c_cpu_windows() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_PerfOS_Processor var q = wmi.CreateQuery(&dst, "") err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint var used, num uint64 var winCPUTotalPerfOS *Win32_PerfRawData_PerfOS_Processor for _, v := range dst { if v.Name == "_Total" { winCPUTotalPerfOS = &v continue } ts := TSys100NStoEpoch(v.Timestamp_Sys100NS) tags := opentsdb.TagSet{"cpu": v.Name} num++ //Divide by 1e5 because: 1 seconds / 100 Nanoseconds = 1e7. This is the percent time as a decimal, so divide by two less zeros to make it the same as the result * 100. used += (v.PercentUserTime + v.PercentPrivilegedTime + v.PercentInterruptTime) / 1e5 AddTS(&md, winCPU, ts, v.PercentPrivilegedTime/1e5, opentsdb.TagSet{"type": "privileged"}.Merge(tags), metadata.Counter, metadata.Pct, descWinCPUPrivileged) AddTS(&md, winCPU, ts, v.PercentInterruptTime/1e5, opentsdb.TagSet{"type": "interrupt"}.Merge(tags), metadata.Counter, metadata.Pct, descWinCPUInterrupt) AddTS(&md, winCPU, ts, v.PercentUserTime/1e5, opentsdb.TagSet{"type": "user"}.Merge(tags), metadata.Counter, metadata.Pct, descWinCPUUser) AddTS(&md, winCPU, ts, v.PercentIdleTime/1e5, opentsdb.TagSet{"type": "idle"}.Merge(tags), metadata.Counter, metadata.Pct, descWinCPUIdle) AddTS(&md, "win.cpu.interrupts", ts, v.InterruptsPersec, tags, metadata.Counter, metadata.Event, descWinCPUInterrupts) Add(&md, "win.cpu.dpcs", v.DPCRate, tags, metadata.Gauge, metadata.Event, descWinCPUDPC) } if num > 0 { cpu := used / num Add(&md, osCPU, cpu, nil, metadata.Counter, metadata.Pct, "") } if winCPUTotalPerfOS != nil { v := winCPUTotalPerfOS ts := TSys100NStoEpoch(v.Timestamp_Sys100NS) AddTS(&md, winCPUTotal, ts, v.PercentPrivilegedTime/1e5, opentsdb.TagSet{"type": "privileged"}, metadata.Counter, metadata.Pct, descWinCPUPrivileged) AddTS(&md, winCPUTotal, ts, v.PercentInterruptTime/1e5, opentsdb.TagSet{"type": "interrupt"}, metadata.Counter, metadata.Pct, descWinCPUInterrupt) AddTS(&md, winCPUTotal, ts, v.PercentUserTime/1e5, opentsdb.TagSet{"type": "user"}, metadata.Counter, metadata.Pct, descWinCPUUser) AddTS(&md, winCPUTotal, ts, v.PercentIdleTime/1e5, opentsdb.TagSet{"type": "idle"}, metadata.Counter, metadata.Pct, descWinCPUIdle) AddTS(&md, "win.cpu_total.interrupts", ts, v.InterruptsPersec, nil, metadata.Counter, metadata.Event, descWinCPUInterrupts) Add(&md, "win.cpu_total.dpcs", v.DPCRate, nil, metadata.Gauge, metadata.Event, descWinCPUDPC) AddTS(&md, winCPUCStates, ts, v.PercentC1Time/1e5, opentsdb.TagSet{"cpu": "total", "type": "c1"}, metadata.Counter, metadata.Pct, descWinCPUC1) AddTS(&md, winCPUCStates, ts, v.PercentC2Time/1e5, opentsdb.TagSet{"cpu": "total", "type": "c2"}, metadata.Counter, metadata.Pct, descWinCPUC2) AddTS(&md, winCPUCStates, ts, v.PercentC3Time/1e5, opentsdb.TagSet{"cpu": "total", "type": "c3"}, metadata.Counter, metadata.Pct, descWinCPUC3) } return md, nil }
func c_mssql_databases() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_MSSQLSERVER_SQLServerDatabases var q = wmi.CreateQuery(&dst, `WHERE Name <> '_Total'`) err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { tags := opentsdb.TagSet{"db": v.Name} Add(&md, "mssql.active_transactions", v.ActiveTransactions, tags, metadata.Gauge, metadata.Count, descMSSQLActiveTransactions) Add(&md, "mssql.backup_restore_throughput", v.BackupPerRestoreThroughputPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLBackupPerRestoreThroughputPersec) Add(&md, "mssql.bulkcopy_rows", v.BulkCopyRowsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLBulkCopyRowsPersec) Add(&md, "mssql.bulkcopy_throughput", v.BulkCopyThroughputPersec, tags, metadata.Counter, metadata.KBytes, descMSSQLBulkCopyThroughputPersec) Add(&md, "mssql.commit_table_entries", v.Committableentries, tags, metadata.Gauge, metadata.Count, descMSSQLCommittableentries) Add(&md, "mssql.data_files_size", v.DataFilesSizeKB*1024, tags, metadata.Gauge, metadata.Bytes, descMSSQLDataFilesSizeKB) Add(&md, "mssql.dbcc_logical_scan_bytes", v.DBCCLogicalScanBytesPersec, tags, metadata.Counter, metadata.BytesPerSecond, descMSSQLDBCCLogicalScanBytesPersec) //Add(&md, "mssql.group_commit_time", v.GroupCommitTimePersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLGroupCommitTimePersec) Add(&md, "mssql.log_bytes_flushed", v.LogBytesFlushedPersec, tags, metadata.Counter, metadata.BytesPerSecond, descMSSQLLogBytesFlushedPersec) Add(&md, "mssql.log_cache_hit_ratio", v.LogCacheHitRatio, tags, metadata.Counter, metadata.Pct, descMSSQLLogCacheHitRatio) Add(&md, "mssql.log_cache_hit_ratio_base", v.LogCacheHitRatio_Base, tags, metadata.Counter, metadata.None, descMSSQLLogCacheHitRatio_Base) Add(&md, "mssql.log_cache_reads", v.LogCacheReadsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLogCacheReadsPersec) Add(&md, "mssql.log_files_size", v.LogFilesSizeKB*1024, tags, metadata.Gauge, metadata.Bytes, descMSSQLLogFilesSizeKB) Add(&md, "mssql.log_files_used_size", v.LogFilesUsedSizeKB*1024, tags, metadata.Gauge, metadata.Bytes, descMSSQLLogFilesUsedSizeKB) Add(&md, "mssql.log_flushes", v.LogFlushesPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLogFlushesPersec) Add(&md, "mssql.log_flush_waits", v.LogFlushWaitsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLogFlushWaitsPersec) Add(&md, "mssql.log_flush_wait_time", v.LogFlushWaitTime, tags, metadata.Counter, metadata.MilliSecond, descMSSQLLogFlushWaitTime) //Add(&md, "mssql.log_flush_write_time_ms", v.LogFlushWriteTimems, tags, metadata.Counter, metadata.MilliSecond, descMSSQLLogFlushWriteTimems) Add(&md, "mssql.log_growths", v.LogGrowths, tags, metadata.Gauge, metadata.Count, descMSSQLLogGrowths) //Add(&md, "mssql.log_pool_cache_misses", v.LogPoolCacheMissesPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLogPoolCacheMissesPersec) //Add(&md, "mssql.log_pool_disk_reads", v.LogPoolDiskReadsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLogPoolDiskReadsPersec) //Add(&md, "mssql.log_pool_requests", v.LogPoolRequestsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLogPoolRequestsPersec) Add(&md, "mssql.log_shrinks", v.LogShrinks, tags, metadata.Gauge, metadata.Count, descMSSQLLogShrinks) Add(&md, "mssql.log_truncations", v.LogTruncations, tags, metadata.Gauge, metadata.Count, descMSSQLLogTruncations) Add(&md, "mssql.percent_log_used", v.PercentLogUsed, tags, metadata.Gauge, metadata.Pct, descMSSQLPercentLogUsed) Add(&md, "mssql.repl_pending_xacts", v.ReplPendingXacts, tags, metadata.Gauge, metadata.Count, descMSSQLReplPendingXacts) Add(&md, "mssql.repl_trans_rate", v.ReplTransRate, tags, metadata.Counter, metadata.PerSecond, descMSSQLReplTransRate) Add(&md, "mssql.shrink_data_movement_bytes", v.ShrinkDataMovementBytesPersec, tags, metadata.Counter, metadata.BytesPerSecond, descMSSQLShrinkDataMovementBytesPersec) Add(&md, "mssql.tracked_transactions", v.TrackedtransactionsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLTrackedtransactionsPersec) Add(&md, "mssql.transactions", v.TransactionsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLTransactionsPersec) Add(&md, "mssql.write_transactions", v.WriteTransactionsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLWriteTransactionsPersec) } return md, nil }
func init() { c := &IntervalCollector{ F: c_mssql, } c.init = wmiInit(c, func() interface{} { return &[]Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics{} }, `WHERE Name <> '_Total'`, &sqlQuery) collectors = append(collectors, c) var dstCluster []MSCluster_Cluster var q = wmi.CreateQuery(&dstCluster, ``) if err := queryWmiNamespace(q, &dstCluster, rootMSCluster); err != nil { sqlClusterName = "None" } else if len(dstCluster) != 1 { sqlClusterName = "Unknown" } else { sqlClusterName = dstCluster[0].Name } c_replica_db := &IntervalCollector{ F: c_mssql_replica_db, } c_replica_db.init = wmiInit(c_replica_db, func() interface{} { return &[]Win32_PerfRawData_MSSQLSERVER_SQLServerDatabaseReplica{} }, `WHERE Name <> '_Total'`, &sqlAGDBQuery) collectors = append(collectors, c_replica_db) c_replica_server := &IntervalCollector{ F: c_mssql_replica_server, } c_replica_server.init = wmiInit(c_replica_server, func() interface{} { return &[]Win32_PerfRawData_MSSQLSERVER_SQLServerAvailabilityReplica{} }, `WHERE Name <> '_Total'`, &sqlAGQuery) collectors = append(collectors, c_replica_server) c_replica_votes := &IntervalCollector{ F: c_mssql_replica_votes, Interval: time.Minute * 5, } c_replica_votes.init = wmiInitNamespace(c_replica_votes, func() interface{} { return &[]MSCluster_Node{} }, fmt.Sprintf("WHERE Name = '%s'", util.Hostname), &sqlAGVotes, rootMSCluster) collectors = append(collectors, c_replica_votes) c_replica_resources := &IntervalCollector{ F: c_mssql_replica_resources, Interval: time.Minute, } c_replica_resources.init = wmiInitNamespace(c_replica_resources, func() interface{} { return &[]MSCluster_Resource{} }, ``, &sqlAGResources, rootMSCluster) collectors = append(collectors, c_replica_resources) }
func c_network_windows() (opentsdb.MultiDataPoint, error) { var dstStats []Win32_PerfRawData_Tcpip_NetworkInterface var q = wmi.CreateQuery(&dstStats, "") err := queryWmi(q, &dstStats) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, nicStats := range dstStats { if interfaceExclusions.MatchString(nicStats.Name) { continue } iface := mNicInstanceNameToInterfaceIndex[nicStats.Name] if iface == "" { continue } // This does NOT include TEAM network adapters. Those will go to os.net.bond tagsIn := opentsdb.TagSet{"iface": iface, "direction": "in"} tagsOut := opentsdb.TagSet{"iface": iface, "direction": "out"} Add(&md, "win.net.ifspeed", nicStats.CurrentBandwidth, opentsdb.TagSet{"iface": iface}, metadata.Gauge, metadata.BitsPerSecond, descWinNetCurrentBandwidth) Add(&md, "win.net.bytes", nicStats.BytesReceivedPersec, tagsIn, metadata.Counter, metadata.BytesPerSecond, descWinNetBytesReceivedPersec) Add(&md, "win.net.bytes", nicStats.BytesSentPersec, tagsOut, metadata.Counter, metadata.BytesPerSecond, descWinNetBytesSentPersec) Add(&md, "win.net.packets", nicStats.PacketsReceivedPersec, tagsIn, metadata.Counter, metadata.PerSecond, descWinNetPacketsReceivedPersec) Add(&md, "win.net.packets", nicStats.PacketsSentPersec, tagsOut, metadata.Counter, metadata.PerSecond, descWinNetPacketsSentPersec) Add(&md, "win.net.dropped", nicStats.PacketsOutboundDiscarded, tagsOut, metadata.Counter, metadata.PerSecond, descWinNetPacketsOutboundDiscarded) Add(&md, "win.net.dropped", nicStats.PacketsReceivedDiscarded, tagsIn, metadata.Counter, metadata.PerSecond, descWinNetPacketsReceivedDiscarded) Add(&md, "win.net.errs", nicStats.PacketsOutboundErrors, tagsOut, metadata.Counter, metadata.PerSecond, descWinNetPacketsOutboundErrors) Add(&md, "win.net.errs", nicStats.PacketsReceivedErrors, tagsIn, metadata.Counter, metadata.PerSecond, descWinNetPacketsReceivedErrors) Add(&md, osNetIfSpeed, nicStats.CurrentBandwidth/1000000, opentsdb.TagSet{"iface": iface}, metadata.Gauge, metadata.Megabit, osNetIfSpeedDesc) Add(&md, osNetBytes, nicStats.BytesReceivedPersec, tagsIn, metadata.Counter, metadata.BytesPerSecond, osNetBytesDesc) Add(&md, osNetBytes, nicStats.BytesSentPersec, tagsOut, metadata.Counter, metadata.BytesPerSecond, osNetBytesDesc) Add(&md, osNetPackets, nicStats.PacketsReceivedPersec, tagsIn, metadata.Counter, metadata.PerSecond, osNetPacketsDesc) Add(&md, osNetPackets, nicStats.PacketsSentPersec, tagsOut, metadata.Counter, metadata.PerSecond, osNetPacketsDesc) Add(&md, osNetDropped, nicStats.PacketsOutboundDiscarded, tagsOut, metadata.Counter, metadata.PerSecond, osNetDroppedDesc) Add(&md, osNetDropped, nicStats.PacketsReceivedDiscarded, tagsIn, metadata.Counter, metadata.PerSecond, osNetDroppedDesc) Add(&md, osNetErrors, nicStats.PacketsOutboundErrors, tagsOut, metadata.Counter, metadata.PerSecond, osNetErrorsDesc) Add(&md, osNetErrors, nicStats.PacketsReceivedErrors, tagsIn, metadata.Counter, metadata.PerSecond, osNetErrorsDesc) } return md, nil }
func c_simple_mem_windows() (opentsdb.MultiDataPoint, error) { var dst []Win32_OperatingSystem var q = wmi.CreateQuery(&dst, "") err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { Add(&md, "win.mem.vm.total", v.TotalVirtualMemorySize*1024, nil, metadata.Gauge, metadata.Bytes, descWinMemVirtual_Total) Add(&md, "win.mem.vm.free", v.FreeVirtualMemory*1024, nil, metadata.Gauge, metadata.Bytes, descWinMemVirtual_Free) Add(&md, "win.mem.total", v.TotalVisibleMemorySize*1024, nil, metadata.Gauge, metadata.Bytes, descWinMemVisible_Total) Add(&md, "win.mem.free", v.FreePhysicalMemory*1024, nil, metadata.Gauge, metadata.Bytes, descWinMemVisible_Free) Add(&md, osMemTotal, v.TotalVisibleMemorySize*1024, nil, metadata.Gauge, metadata.Bytes, osMemTotalDesc) Add(&md, osMemFree, v.FreePhysicalMemory*1024, nil, metadata.Gauge, metadata.Bytes, osMemFreeDesc) Add(&md, osMemUsed, v.TotalVisibleMemorySize*1024-v.FreePhysicalMemory*1024, nil, metadata.Gauge, metadata.Bytes, osMemUsedDesc) Add(&md, osMemPctFree, float64(v.FreePhysicalMemory)/float64(v.TotalVisibleMemorySize)*100, nil, metadata.Gauge, metadata.Pct, osMemPctFreeDesc) } return md, nil }
func c_mssql_locks() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_MSSQLSERVER_SQLServerLocks var q = wmi.CreateQuery(&dst, `WHERE Name = 'Page' OR Name = 'Extent' OR Name = 'Object' or Name = 'Database'`) err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { tags := opentsdb.TagSet{"type": v.Name} Add(&md, "mssql.lock_wait_time", v.AverageWaitTimems, tags, metadata.Counter, metadata.MilliSecond, descMSSQLAverageWaitTimems) Add(&md, "mssql.lock_requests", v.LockRequestsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLockRequestsPersec) Add(&md, "mssql.lock_timeouts", v.LockTimeoutsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLockTimeoutsPersec) Add(&md, "mssql.lock_timeouts0", v.LockTimeoutstimeout0Persec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLockTimeoutstimeout0Persec) Add(&md, "mssql.lock_waits", v.LockWaitsPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLLockWaitsPersec) Add(&md, "mssql.deadlocks", v.NumberofDeadlocksPersec, tags, metadata.Counter, metadata.PerSecond, descMSSQLNumberofDeadlocksPersec) } return md, nil }
func c_windows_pagefile() (opentsdb.MultiDataPoint, error) { var dst []Win32_PageFileUsage var q = wmi.CreateQuery(&dst, "") err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { driveletter := "unknown" if len(v.Name) >= 1 { driveletter = v.Name[0:1] } tags := opentsdb.TagSet{"drive": driveletter} Add(&md, "win.mem.pagefile.size", int64(v.AllocatedBaseSize)*1024*1024, tags, metadata.Gauge, metadata.Bytes, descWinMemPagefileAllocatedBaseSize) Add(&md, "win.mem.pagefile.usage_current", int64(v.CurrentUsage)*1024*1024, tags, metadata.Gauge, metadata.Bytes, descWinMemPagefileCurrentUsage) Add(&md, "win.mem.pagefile.usage_peak", int64(v.PeakUsage)*1024*1024, tags, metadata.Gauge, metadata.Bytes, descWinMemPagefilePeakUsage) Add(&md, "win.mem.pagefile.usage_percent", float64(v.CurrentUsage)/float64(v.AllocatedBaseSize)*100, tags, metadata.Gauge, metadata.Pct, descWinMemPagefilePercent) } return md, nil }
func c_mssql_general() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics var q = wmi.CreateQuery(&dst, `WHERE Name <> '_Total'`) if err := queryWmi(q, &dst); err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { Add(&md, "mssql.user_connections", v.UserConnections, nil, metadata.Gauge, metadata.Count, descMSSQLUserConnections) Add(&md, "mssql.connection_resets", v.ConnectionResetPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLConnectionResetPersec) Add(&md, "mssql.logins", v.LoginsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLLoginsPersec) Add(&md, "mssql.logouts", v.LogoutsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLLogoutsPersec) Add(&md, "mssql.mars_deadlocks", v.MarsDeadlocks, nil, metadata.Counter, metadata.Count, descMSSQLMarsDeadlocks) Add(&md, "mssql.proc_blocked", v.Processesblocked, nil, metadata.Gauge, metadata.Count, descMSSQLProcessesblocked) Add(&md, "mssql.temptables_created", v.TempTablesCreationRate, nil, metadata.Counter, metadata.PerSecond, descMSSQLTempTablesCreationRate) Add(&md, "mssql.temptables_to_destroy", v.TempTablesForDestruction, nil, metadata.Gauge, metadata.Count, descMSSQLTempTablesForDestruction) Add(&md, "mssql.transactions_total", v.Transactions, nil, metadata.Gauge, metadata.Count, descMSSQLTransactions) } return md, nil }
func c_cpu_info_windows() (opentsdb.MultiDataPoint, error) { var dst []Win32_Processor var q = wmi.CreateQuery(&dst, `WHERE Name <> '_Total'`) err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { tags := opentsdb.TagSet{"cpu": strings.Replace(v.DeviceID, "CPU", "", 1)} Add(&md, osCPUClock, v.CurrentClockSpeed, tags, metadata.Gauge, metadata.MHz, osCPUClockDesc) Add(&md, "win.cpu.clock", v.CurrentClockSpeed, tags, metadata.Gauge, metadata.MHz, descWinCPUClock) Add(&md, "win.cpu.clock_max", v.MaxClockSpeed, tags, metadata.Gauge, metadata.MHz, descWinCPUClockMax) Add(&md, "win.cpu.voltage", v.CurrentVoltage, tags, metadata.Gauge, metadata.V10, descWinCPUVoltage) Add(&md, "win.cpu.cores_physical", v.NumberOfCores, tags, metadata.Gauge, metadata.Count, descWinCPUCores) Add(&md, "win.cpu.cores_logical", v.NumberOfLogicalProcessors, tags, metadata.Gauge, metadata.Count, descWinCPUCoresLogical) if v.LoadPercentage != nil { Add(&md, "win.cpu.load", *v.LoadPercentage, tags, metadata.Gauge, metadata.Pct, descWinCPULoad) } } return md, nil }
func c_system_windows() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_PerfOS_System var q = wmi.CreateQuery(&dst, "") err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { //see http://microsoft.public.win32.programmer.wmi.narkive.com/09kqthVC/lastbootuptime var uptime = (v.Timestamp_Object - v.SystemUpTime) / v.Frequency_Object Add(&md, "win.system.context_switches", v.ContextSwitchesPersec, nil, metadata.Counter, metadata.ContextSwitch, descWinSystemContextSwitchesPersec) Add(&md, "win.system.exceptions", v.ExceptionDispatchesPersec, nil, metadata.Counter, metadata.PerSecond, descWinSystemExceptionDispatchesPersec) Add(&md, "win.system.cpu_queue", v.ProcessorQueueLength, nil, metadata.Gauge, metadata.Count, descWinSystemProcessorQueueLength) Add(&md, "win.system.syscall", v.SystemCallsPersec, nil, metadata.Counter, metadata.Syscall, descWinSystemSystemCallsPersec) Add(&md, "win.system.threads", v.Threads, nil, metadata.Gauge, metadata.Count, descWinSystemThreads) Add(&md, "win.system.uptime", uptime, nil, metadata.Gauge, metadata.Second, osSystemUptimeDesc) Add(&md, "win.system.processes", v.Processes, nil, metadata.Gauge, metadata.Count, descWinSystemProcesses) Add(&md, osSystemUptime, uptime, nil, metadata.Gauge, metadata.Second, osSystemUptimeDesc) } return md, nil }
func c_mssql_statistics() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatistics var q = wmi.CreateQuery(&dst, `WHERE Name <> '_Total'`) err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { Add(&md, "mssql.autoparam_attempts", v.AutoParamAttemptsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLAutoParamAttemptsPersec) Add(&md, "mssql.autoparam_failed", v.FailedAutoParamsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLFailedAutoParamsPersec) Add(&md, "mssql.autoparam_forced", v.ForcedParameterizationsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLForcedParameterizationsPersec) Add(&md, "mssql.autoparam_safe", v.SafeAutoParamsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLSafeAutoParamsPersec) Add(&md, "mssql.autoparam_unsafe", v.UnsafeAutoParamsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLUnsafeAutoParamsPersec) Add(&md, "mssql.batches", v.BatchRequestsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLBatchRequestsPersec) Add(&md, "mssql.guided_plans", v.GuidedplanexecutionsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLGuidedplanexecutionsPersec) Add(&md, "mssql.misguided_plans", v.MisguidedplanexecutionsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLMisguidedplanexecutionsPersec) Add(&md, "mssql.compilations", v.SQLCompilationsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLSQLCompilationsPersec) Add(&md, "mssql.recompilations", v.SQLReCompilationsPersec, nil, metadata.Counter, metadata.PerSecond, descMSSQLSQLReCompilationsPersec) } return md, nil }
func c_physical_disk_windows() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_PerfDisk_PhysicalDisk var q = wmi.CreateQuery(&dst, `WHERE Name <> '_Total'`) err := queryWmi(q, &dst) if err != nil { return nil, err } var md opentsdb.MultiDataPoint for _, v := range dst { Add(&md, "win.disk.duration", v.AvgDiskSecPerRead/winDisk100nS_1mS, opentsdb.TagSet{"disk": v.Name, "type": "read"}, metadata.Counter, metadata.MilliSecond, "Time, in milliseconds, of a read from the disk.") Add(&md, "win.disk.duration", v.AvgDiskSecPerWrite/winDisk100nS_1mS, opentsdb.TagSet{"disk": v.Name, "type": "write"}, metadata.Counter, metadata.MilliSecond, "Time, in milliseconds, of a write to the disk.") Add(&md, "win.disk.queue", v.AvgDiskReadQueueLength/winDisk100nS_1S, opentsdb.TagSet{"disk": v.Name, "type": "read"}, metadata.Counter, metadata.Operation, "Number of read requests that were queued for the disk.") Add(&md, "win.disk.queue", v.AvgDiskWriteQueueLength/winDisk100nS_1S, opentsdb.TagSet{"disk": v.Name, "type": "write"}, metadata.Counter, metadata.Operation, "Number of write requests that were queued for the disk.") Add(&md, "win.disk.ops", v.DiskReadsPerSec, opentsdb.TagSet{"disk": v.Name, "type": "read"}, metadata.Counter, metadata.PerSecond, "Number of read operations on the disk.") Add(&md, "win.disk.ops", v.DiskWritesPerSec, opentsdb.TagSet{"disk": v.Name, "type": "write"}, metadata.Counter, metadata.PerSecond, "Number of write operations on the disk.") Add(&md, "win.disk.bytes", v.DiskReadBytesPerSec, opentsdb.TagSet{"disk": v.Name, "type": "read"}, metadata.Counter, metadata.BytesPerSecond, "Number of bytes read from the disk.") Add(&md, "win.disk.bytes", v.DiskWriteBytesPerSec, opentsdb.TagSet{"disk": v.Name, "type": "write"}, metadata.Counter, metadata.BytesPerSecond, "Number of bytes written to the disk.") Add(&md, "win.disk.percent_time", v.PercentDiskReadTime/winDisk100nS_Pct, opentsdb.TagSet{"disk": v.Name, "type": "read"}, metadata.Counter, metadata.Pct, "Percentage of time that the disk was busy servicing read requests.") Add(&md, "win.disk.percent_time", v.PercentDiskWriteTime/winDisk100nS_Pct, opentsdb.TagSet{"disk": v.Name, "type": "write"}, metadata.Counter, metadata.Pct, "Percentage of time that the disk was busy servicing write requests.") Add(&md, "win.disk.spltio", v.SplitIOPerSec, opentsdb.TagSet{"disk": v.Name}, metadata.Counter, metadata.PerSecond, "Number of requests to the disk that were split into multiple requests due to size or fragmentation.") } return md, nil }
func c_windows_processes() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_PerfProc_Process var q = wmi.CreateQuery(&dst, `WHERE Name <> '_Total'`) err := queryWmi(q, &dst) if err != nil { return nil, err } var svc_dst []Win32_Service var svc_q = wmi.CreateQuery(&svc_dst, "") err = queryWmi(svc_q, &svc_dst) if err != nil { return nil, err } var iis_dst []WorkerProcess iis_q := wmi.CreateQuery(&iis_dst, "") err = queryWmiNamespace(iis_q, &iis_dst, "root\\WebAdministration") if err != nil { // Don't return from this error since the name space might exist. iis_dst = nil } var numberOfLogicalProcessors uint64 var core_dst []Win32_ComputerSystem var core_q = wmi.CreateQuery(&core_dst, "") err = queryWmi(core_q, &core_dst) if err != nil { return nil, err } for _, y := range core_dst { numberOfLogicalProcessors = uint64(y.NumberOfLogicalProcessors) } if numberOfLogicalProcessors == 0 { return nil, fmt.Errorf("invalid result: numberOfLogicalProcessors=%v", numberOfLogicalProcessors) } var md opentsdb.MultiDataPoint var svc_dst_started []Win32_Service for _, svc := range svc_dst { if nameMatches(svc.Name, regexesProcesses) { if svc.Started { svc_dst_started = append(svc_dst_started, svc) } tags := opentsdb.TagSet{"name": svc.Name} Add(&md, "win.service.started", btoi(svc.Started), tags, metadata.Gauge, metadata.Bool, descWinServiceStatus) Add(&md, "win.service.status", btoi(svc.Status != "OK"), tags, metadata.Gauge, metadata.Ok, descWinServiceStatus) Add(&md, "win.service.checkpoint", svc.CheckPoint, tags, metadata.Gauge, metadata.None, descWinServiceCheckPoint) Add(&md, "win.service.wait_hint", svc.WaitHint, tags, metadata.Gauge, metadata.MilliSecond, descWinServiceWaitHint) } } for _, v := range dst { var name string service_match := false iis_match := false process_match := nameMatches(v.Name, regexesProcesses) id := "0" if process_match { raw_name := strings.Split(v.Name, "#") name = raw_name[0] if len(raw_name) == 2 { id = raw_name[1] } // If you have a hash sign in your process name you don't deserve monitoring ;-) if len(raw_name) > 2 { continue } } // A Service match could "overwrite" a process match, but that is probably what we would want for _, svc := range svc_dst_started { // It is possible the pid has gone and been reused, but I think this unlikely // And I'm not aware of an atomic join we could do anyways if svc.ProcessId != 0 && svc.ProcessId == v.IDProcess { id = "0" service_match = true name = svc.Name break } } for _, a_pool := range iis_dst { if a_pool.ProcessId == v.IDProcess { id = "0" iis_match = true name = strings.Join([]string{"iis", a_pool.AppPoolName}, "_") break } } if !(service_match || process_match || iis_match) { continue } //Use timestamp from WMI to fix issues with CPU metrics ts := TSys100NStoEpoch(v.Timestamp_Sys100NS) tags := opentsdb.TagSet{"name": name, "id": id} AddTS(&md, "win.proc.cpu", ts, v.PercentPrivilegedTime/NS100_Seconds/numberOfLogicalProcessors, opentsdb.TagSet{"type": "privileged"}.Merge(tags), metadata.Counter, metadata.Pct, descWinProcCPU_priv) AddTS(&md, "win.proc.cpu", ts, v.PercentUserTime/NS100_Seconds/numberOfLogicalProcessors, opentsdb.TagSet{"type": "user"}.Merge(tags), metadata.Counter, metadata.Pct, descWinProcCPU_user) AddTS(&md, "win.proc.cpu_total", ts, v.PercentProcessorTime/NS100_Seconds/numberOfLogicalProcessors, tags, metadata.Counter, metadata.Pct, descWinProcCPU_total) Add(&md, "win.proc.elapsed_time", (v.Timestamp_Object-v.ElapsedTime)/v.Frequency_Object, tags, metadata.Gauge, metadata.Second, descWinProcElapsed_time) Add(&md, "win.proc.handle_count", v.HandleCount, tags, metadata.Gauge, metadata.Count, descWinProcHandle_count) Add(&md, "win.proc.io_bytes", v.IOOtherBytesPersec, opentsdb.TagSet{"type": "other"}.Merge(tags), metadata.Counter, metadata.BytesPerSecond, descWinProcIo_bytes_other) Add(&md, "win.proc.io_bytes", v.IOReadBytesPersec, opentsdb.TagSet{"type": "read"}.Merge(tags), metadata.Counter, metadata.BytesPerSecond, descWinProcIo_bytes_read) Add(&md, "win.proc.io_bytes", v.IOWriteBytesPersec, opentsdb.TagSet{"type": "write"}.Merge(tags), metadata.Counter, metadata.BytesPerSecond, descWinProcIo_bytes_write) Add(&md, "win.proc.io_operations", v.IOOtherOperationsPersec, opentsdb.TagSet{"type": "other"}.Merge(tags), metadata.Counter, metadata.Operation, descWinProcIo_operations) Add(&md, "win.proc.io_operations", v.IOReadOperationsPersec, opentsdb.TagSet{"type": "read"}.Merge(tags), metadata.Counter, metadata.Operation, descWinProcIo_operations_read) Add(&md, "win.proc.io_operations", v.IOWriteOperationsPersec, opentsdb.TagSet{"type": "write"}.Merge(tags), metadata.Counter, metadata.Operation, descWinProcIo_operations_write) Add(&md, "win.proc.mem.page_faults", v.PageFaultsPersec, tags, metadata.Counter, metadata.PerSecond, descWinProcMemPage_faults) Add(&md, "win.proc.mem.pagefile_bytes", v.PageFileBytes, tags, metadata.Gauge, metadata.Bytes, descWinProcMemPagefile_bytes) Add(&md, "win.proc.mem.pagefile_bytes_peak", v.PageFileBytesPeak, tags, metadata.Gauge, metadata.Bytes, descWinProcMemPagefile_bytes_peak) Add(&md, "win.proc.mem.pool_nonpaged_bytes", v.PoolNonpagedBytes, tags, metadata.Gauge, metadata.Bytes, descWinProcMemPool_nonpaged_bytes) Add(&md, "win.proc.mem.pool_paged_bytes", v.PoolPagedBytes, tags, metadata.Gauge, metadata.Bytes, descWinProcMemPool_paged_bytes) Add(&md, "win.proc.mem.vm.bytes", v.VirtualBytes, tags, metadata.Gauge, metadata.Bytes, descWinProcMemVmBytes) Add(&md, "win.proc.mem.vm.bytes_peak", v.VirtualBytesPeak, tags, metadata.Gauge, metadata.Bytes, descWinProcMemVmBytes_peak) Add(&md, "win.proc.mem.working_set", v.WorkingSet, tags, metadata.Gauge, metadata.Bytes, descWinProcMemWorking_set) Add(&md, "win.proc.mem.working_set_peak", v.WorkingSetPeak, tags, metadata.Gauge, metadata.Bytes, descWinProcMemWorking_set_peak) Add(&md, "win.proc.mem.working_set_private", v.WorkingSetPrivate, tags, metadata.Gauge, metadata.Bytes, descWinProcMemWorking_set_private) Add(&md, "win.proc.priority_base", v.PriorityBase, tags, metadata.Gauge, metadata.None, descWinProcPriority_base) Add(&md, "win.proc.private_bytes", v.PrivateBytes, tags, metadata.Gauge, metadata.Bytes, descWinProcPrivate_bytes) Add(&md, "win.proc.thread_count", v.ThreadCount, tags, metadata.Gauge, metadata.Count, descWinProcthread_count) } return md, nil }
func c_meta_windows_ifaces() (opentsdb.MultiDataPoint, error) { var md opentsdb.MultiDataPoint var dstConfigs []Win32_NetworkAdapterConfiguration q := wmi.CreateQuery(&dstConfigs, "WHERE MACAddress != null") err := wmi.Query(q, &dstConfigs) if err != nil { slog.Error(err) return md, err } mNicConfigs := make(map[uint32]*Win32_NetworkAdapterConfiguration) for i, nic := range dstConfigs { mNicConfigs[nic.InterfaceIndex] = &dstConfigs[i] } mNicTeamIDtoSpeed := make(map[string]uint64) mNicTeamIDtoMaster := make(map[string]string) var dstTeamMembers []MSFT_NetLbfoTeamMember q = wmi.CreateQuery(&dstTeamMembers, "") err = wmi.QueryNamespace(q, &dstTeamMembers, "root\\StandardCimv2") if err == nil { for _, teamMember := range dstTeamMembers { mNicTeamIDtoSpeed[teamMember.InstanceID] = teamMember.ReceiveLinkSpeed mNicTeamIDtoMaster[teamMember.InstanceID] = teamMember.Team } } var dstAdapters []Win32_NetworkAdapter q = wmi.CreateQuery(&dstAdapters, "WHERE PhysicalAdapter=True and MACAddress <> null and NetConnectionStatus = 2") //Only adapters with MAC addresses and status="Connected" err = wmi.Query(q, &dstAdapters) if err != nil { slog.Error(err) return md, err } mNicIndextoIPs := make(map[int]string) ifaces, _ := net.Interfaces() for _, iface := range ifaces { if iface.Flags&(net.FlagLoopback|net.FlagPointToPoint) != 0 { continue } rawAds, _ := iface.Addrs() addrs := make([]string, len(rawAds)) for i, rAd := range rawAds { addrs[i] = rAd.String() } sort.Strings(addrs) j, _ := json.Marshal(addrs) mNicIndextoIPs[iface.Index] = string(j) } for _, v := range dstAdapters { tag := opentsdb.TagSet{"iface": fmt.Sprint("Interface", v.InterfaceIndex)} metadata.AddMeta("", tag, "description", v.Description, true) metadata.AddMeta("", tag, "name", v.NetConnectionID, true) metadata.AddMeta("", tag, "mac", strings.Replace(v.MACAddress, ":", "", -1), true) if v.Speed != nil && *v.Speed != 0 { metadata.AddMeta("", tag, "speed", v.Speed, true) } else { nicSpeed := mNicTeamIDtoSpeed[v.GUID] metadata.AddMeta("", tag, "speed", nicSpeed, true) } nicMaster := mNicTeamIDtoMaster[v.GUID] if nicMaster != "" { metadata.AddMeta("", tag, "master", nicMaster, true) } nicIPs := mNicIndextoIPs[int(v.InterfaceIndex)] if nicIPs == "" { nicIPs = "[]" } metadata.AddMeta("", tag, "addresses", nicIPs, true) } return md, nil }
func c_dotnet_memory() (opentsdb.MultiDataPoint, error) { var dst []Win32_PerfRawData_NETFramework_NETCLRMemory err := queryWmi(dotnetMemoryQuery, &dst) if err != nil { return nil, err } var svc_dst []Win32_Service var svc_q = wmi.CreateQuery(&svc_dst, `WHERE Started=true`) err = queryWmi(svc_q, &svc_dst) if err != nil { return nil, err } var iis_dst []WorkerProcess iis_q := wmi.CreateQuery(&iis_dst, "") err = queryWmiNamespace(iis_q, &iis_dst, "root\\WebAdministration") if err != nil { iis_dst = nil } var md opentsdb.MultiDataPoint for _, v := range dst { var name string service_match := false iis_match := false process_match := nameMatches(v.Name, regexesDotNet) id := "0" if process_match { raw_name := strings.Split(v.Name, "#") name = raw_name[0] if len(raw_name) == 2 { id = raw_name[1] } // If you have a hash sign in your process name you don't deserve monitoring ;-) if len(raw_name) > 2 { continue } } // A Service match could "overwrite" a process match, but that is probably what we would want. for _, svc := range svc_dst { if nameMatches(svc.Name, regexesDotNet) { // It is possible the pid has gone and been reused, but I think this unlikely // and I'm not aware of an atomic join we could do anyways. if svc.ProcessId != 0 && svc.ProcessId == v.ProcessID { id = "0" service_match = true name = svc.Name break } } } for _, a_pool := range iis_dst { if a_pool.ProcessId == v.ProcessID { id = "0" iis_match = true name = strings.Join([]string{"iis", a_pool.AppPoolName}, "_") break } } if !(service_match || process_match || iis_match) { continue } tags := opentsdb.TagSet{"name": name, "id": id} Add(&md, "dotnet.memory.finalization_survivors", v.FinalizationSurvivors, tags, metadata.Gauge, metadata.Count, descWinDotNetMemoryFinalizationSurvivors) Add(&md, "dotnet.memory.gen0_promoted", v.Gen0PromotedBytesPerSec, tags, metadata.Counter, metadata.BytesPerSecond, descWinDotNetMemoryGen0PromotedBytesPerSec) Add(&md, "dotnet.memory.gen0_promoted_finalized", v.PromotedFinalizationMemoryfromGen0, tags, metadata.Gauge, metadata.PerSecond, descWinDotNetMemoryPromotedFinalizationMemoryfromGen0) Add(&md, "dotnet.memory.gen1_promoted", v.Gen1PromotedBytesPerSec, tags, metadata.Counter, metadata.BytesPerSecond, descWinDotNetMemoryGen1PromotedBytesPerSec) Add(&md, "dotnet.memory.heap_allocations", v.AllocatedBytesPersec, tags, metadata.Counter, metadata.BytesPerSecond, descWinDotNetMemoryAllocatedBytesPersec) Add(&md, "dotnet.memory.heap_size_gen0_max", v.Gen0heapsize, tags, metadata.Gauge, metadata.Bytes, descWinDotNetMemoryGen0heapsize) Add(&md, "dotnet.memory.heap_size", v.Gen1heapsize, opentsdb.TagSet{"type": "gen1"}.Merge(tags), metadata.Gauge, metadata.Bytes, descWinDotNetMemoryGen1heapsize) Add(&md, "dotnet.memory.heap_size", v.Gen2heapsize, opentsdb.TagSet{"type": "gen2"}.Merge(tags), metadata.Gauge, metadata.Bytes, descWinDotNetMemoryGen2heapsize) Add(&md, "dotnet.memory.heap_size", v.LargeObjectHeapsize, opentsdb.TagSet{"type": "large_object"}.Merge(tags), metadata.Gauge, metadata.Bytes, descWinDotNetMemoryLargeObjectHeapsize) Add(&md, "dotnet.memory.heap_size", v.NumberBytesinallHeaps, opentsdb.TagSet{"type": "total"}.Merge(tags), metadata.Gauge, metadata.Bytes, descWinDotNetMemoryNumberBytesinallHeaps) Add(&md, "dotnet.memory.gc_handles", v.NumberGCHandles, tags, metadata.Gauge, metadata.Count, descWinDotNetMemoryNumberGCHandles) Add(&md, "dotnet.memory.gc_collections", v.NumberGen0Collections, opentsdb.TagSet{"type": "gen0"}.Merge(tags), metadata.Counter, metadata.Count, descWinDotNetMemoryNumberGen0Collections) Add(&md, "dotnet.memory.gc_collections", v.NumberGen1Collections, opentsdb.TagSet{"type": "gen1"}.Merge(tags), metadata.Counter, metadata.Count, descWinDotNetMemoryNumberGen1Collections) Add(&md, "dotnet.memory.gc_collections", v.NumberGen2Collections, opentsdb.TagSet{"type": "gen2"}.Merge(tags), metadata.Counter, metadata.Count, descWinDotNetMemoryNumberGen2Collections) Add(&md, "dotnet.memory.gc_collections", v.NumberInducedGC, opentsdb.TagSet{"type": "induced"}.Merge(tags), metadata.Counter, metadata.Count, descWinDotNetMemoryNumberInducedGC) Add(&md, "dotnet.memory.pinned_objects", v.NumberofPinnedObjects, tags, metadata.Gauge, metadata.Count, descWinDotNetMemoryNumberofPinnedObjects) Add(&md, "dotnet.memory.sink_blocks", v.NumberofSinkBlocksinuse, tags, metadata.Gauge, metadata.Count, descWinDotNetMemoryNumberofSinkBlocksinuse) Add(&md, "dotnet.memory.virtual_committed", v.NumberTotalcommittedBytes, tags, metadata.Gauge, metadata.Bytes, descWinDotNetMemoryNumberTotalcommittedBytes) Add(&md, "dotnet.memory.virtual_reserved", v.NumberTotalreservedBytes, tags, metadata.Gauge, metadata.Bytes, descWinDotNetMemoryNumberTotalreservedBytes) if v.PercentTimeinGC_Base != 0 { Add(&md, "dotnet.memory.gc_time", float64(v.PercentTimeinGC)/float64(v.PercentTimeinGC_Base)*100, tags, metadata.Gauge, metadata.Pct, descWinDotNetMemoryPercentTimeinGC) } } return md, nil }