mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-03-09 12:06:35 +00:00
process: Use registry collector for V1 data (#1814)
Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
@@ -19,14 +19,12 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"maps"
|
||||
"regexp"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/prometheus-community/windows_exporter/internal/mi"
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"golang.org/x/sys/windows/registry"
|
||||
@@ -270,26 +268,36 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
|
||||
return errors.Join(errs...)
|
||||
}
|
||||
|
||||
type collectorName interface {
|
||||
GetName() string
|
||||
}
|
||||
|
||||
// deduplicateIISNames deduplicate IIS site names from various IIS perflib objects.
|
||||
//
|
||||
// E.G. Given the following list of site names, "Site_B" would be
|
||||
// discarded, and "Site_B#2" would be kept and presented as "Site_B" in the
|
||||
// Collector metrics.
|
||||
// [ "Site_A", "Site_B", "Site_C", "Site_B#2" ].
|
||||
func deduplicateIISNames(counterValues map[string]map[string]perfdata.CounterValue) {
|
||||
services := slices.Collect(maps.Keys(counterValues))
|
||||
func deduplicateIISNames[T collectorName](counterValues []T) {
|
||||
indexes := make(map[string]int)
|
||||
|
||||
// Ensure IIS entry with the highest suffix occurs last
|
||||
slices.Sort(services)
|
||||
slices.SortFunc(counterValues, func(a, b T) int {
|
||||
return strings.Compare(a.GetName(), b.GetName())
|
||||
})
|
||||
|
||||
// Use map to deduplicate IIS entries
|
||||
for _, entry := range services {
|
||||
name := strings.Split(entry, "#")[0]
|
||||
if name == entry {
|
||||
for index, counterValue := range counterValues {
|
||||
name := strings.Split(counterValue.GetName(), "#")[0]
|
||||
if name == counterValue.GetName() {
|
||||
continue
|
||||
}
|
||||
|
||||
counterValues[name] = counterValues[entry]
|
||||
delete(counterValues, entry)
|
||||
if originalIndex, ok := indexes[name]; !ok {
|
||||
counterValues[originalIndex] = counterValue
|
||||
counterValues = slices.Delete(counterValues, index, 1)
|
||||
} else {
|
||||
indexes[name] = index
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,13 +18,14 @@ package iis
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorAppPoolWAS struct {
|
||||
perfDataCollectorAppPoolWAS *perfdata.Collector
|
||||
perfDataCollectorAppPoolWAS *pdh.Collector
|
||||
perfDataObjectAppPoolWAS []perfDataCounterValuesAppPoolWAS
|
||||
|
||||
currentApplicationPoolState *prometheus.Desc
|
||||
currentApplicationPoolUptime *prometheus.Desc
|
||||
@@ -40,22 +41,27 @@ type collectorAppPoolWAS struct {
|
||||
totalWorkerProcessShutdownFailures *prometheus.Desc
|
||||
totalWorkerProcessStartupFailures *prometheus.Desc
|
||||
}
|
||||
type perfDataCounterValuesAppPoolWAS struct {
|
||||
Name string
|
||||
|
||||
const (
|
||||
CurrentApplicationPoolState = "Current Application Pool State"
|
||||
CurrentApplicationPoolUptime = "Current Application Pool Uptime"
|
||||
CurrentWorkerProcesses = "Current Worker Processes"
|
||||
MaximumWorkerProcesses = "Maximum Worker Processes"
|
||||
RecentWorkerProcessFailures = "Recent Worker Process Failures"
|
||||
TimeSinceLastWorkerProcessFailure = "Time Since Last Worker Process Failure"
|
||||
TotalApplicationPoolRecycles = "Total Application Pool Recycles"
|
||||
TotalApplicationPoolUptime = "Total Application Pool Uptime"
|
||||
TotalWorkerProcessesCreated = "Total Worker Processes Created"
|
||||
TotalWorkerProcessFailures = "Total Worker Process Failures"
|
||||
TotalWorkerProcessPingFailures = "Total Worker Process Ping Failures"
|
||||
TotalWorkerProcessShutdownFailures = "Total Worker Process Shutdown Failures"
|
||||
TotalWorkerProcessStartupFailures = "Total Worker Process Startup Failures"
|
||||
)
|
||||
CurrentApplicationPoolState float64 `perfdata:"Current Application Pool State"`
|
||||
CurrentApplicationPoolUptime float64 `perfdata:"Current Application Pool Uptime"`
|
||||
CurrentWorkerProcesses float64 `perfdata:"Current Worker Processes"`
|
||||
MaximumWorkerProcesses float64 `perfdata:"Maximum Worker Processes"`
|
||||
RecentWorkerProcessFailures float64 `perfdata:"Recent Worker Process Failures"`
|
||||
TimeSinceLastWorkerProcessFailure float64 `perfdata:"Time Since Last Worker Process Failure"`
|
||||
TotalApplicationPoolRecycles float64 `perfdata:"Total Application Pool Recycles"`
|
||||
TotalApplicationPoolUptime float64 `perfdata:"Total Application Pool Uptime"`
|
||||
TotalWorkerProcessesCreated float64 `perfdata:"Total Worker Processes Created"`
|
||||
TotalWorkerProcessFailures float64 `perfdata:"Total Worker Process Failures"`
|
||||
TotalWorkerProcessPingFailures float64 `perfdata:"Total Worker Process Ping Failures"`
|
||||
TotalWorkerProcessShutdownFailures float64 `perfdata:"Total Worker Process Shutdown Failures"`
|
||||
TotalWorkerProcessStartupFailures float64 `perfdata:"Total Worker Process Startup Failures"`
|
||||
}
|
||||
|
||||
func (p perfDataCounterValuesAppPoolWAS) GetName() string {
|
||||
return p.Name
|
||||
}
|
||||
|
||||
//nolint:gochecknoglobals
|
||||
var applicationStates = map[uint32]string{
|
||||
@@ -71,21 +77,7 @@ var applicationStates = map[uint32]string{
|
||||
func (c *Collector) buildAppPoolWAS() error {
|
||||
var err error
|
||||
|
||||
c.perfDataCollectorAppPoolWAS, err = perfdata.NewCollector("APP_POOL_WAS", perfdata.InstancesAll, []string{
|
||||
CurrentApplicationPoolState,
|
||||
CurrentApplicationPoolUptime,
|
||||
CurrentWorkerProcesses,
|
||||
MaximumWorkerProcesses,
|
||||
RecentWorkerProcessFailures,
|
||||
TimeSinceLastWorkerProcessFailure,
|
||||
TotalApplicationPoolRecycles,
|
||||
TotalApplicationPoolUptime,
|
||||
TotalWorkerProcessesCreated,
|
||||
TotalWorkerProcessFailures,
|
||||
TotalWorkerProcessPingFailures,
|
||||
TotalWorkerProcessShutdownFailures,
|
||||
TotalWorkerProcessStartupFailures,
|
||||
})
|
||||
c.perfDataCollectorAppPoolWAS, err = pdh.NewCollector[perfDataCounterValuesAppPoolWAS]("APP_POOL_WAS", pdh.InstancesAll)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create APP_POOL_WAS collector: %w", err)
|
||||
}
|
||||
@@ -174,21 +166,21 @@ func (c *Collector) buildAppPoolWAS() error {
|
||||
}
|
||||
|
||||
func (c *Collector) collectAppPoolWAS(ch chan<- prometheus.Metric) error {
|
||||
perfData, err := c.perfDataCollectorAppPoolWAS.Collect()
|
||||
err := c.perfDataCollectorAppPoolWAS.Collect(&c.perfDataObjectAppPoolWAS)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect APP_POOL_WAS metrics: %w", err)
|
||||
}
|
||||
|
||||
deduplicateIISNames(perfData)
|
||||
deduplicateIISNames(c.perfDataObjectAppPoolWAS)
|
||||
|
||||
for name, app := range perfData {
|
||||
if c.config.AppExclude.MatchString(name) || !c.config.AppInclude.MatchString(name) {
|
||||
for _, data := range c.perfDataObjectAppPoolWAS {
|
||||
if c.config.AppExclude.MatchString(data.Name) || !c.config.AppInclude.MatchString(data.Name) {
|
||||
continue
|
||||
}
|
||||
|
||||
for key, label := range applicationStates {
|
||||
isCurrentState := 0.0
|
||||
if key == uint32(app[CurrentApplicationPoolState].FirstValue) {
|
||||
if key == uint32(data.CurrentApplicationPoolState) {
|
||||
isCurrentState = 1.0
|
||||
}
|
||||
|
||||
@@ -196,7 +188,7 @@ func (c *Collector) collectAppPoolWAS(ch chan<- prometheus.Metric) error {
|
||||
c.currentApplicationPoolState,
|
||||
prometheus.GaugeValue,
|
||||
isCurrentState,
|
||||
name,
|
||||
data.Name,
|
||||
label,
|
||||
)
|
||||
}
|
||||
@@ -204,74 +196,74 @@ func (c *Collector) collectAppPoolWAS(ch chan<- prometheus.Metric) error {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.currentApplicationPoolUptime,
|
||||
prometheus.GaugeValue,
|
||||
app[CurrentApplicationPoolUptime].FirstValue,
|
||||
name,
|
||||
data.CurrentApplicationPoolUptime,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.currentWorkerProcesses,
|
||||
prometheus.GaugeValue,
|
||||
app[CurrentWorkerProcesses].FirstValue,
|
||||
name,
|
||||
data.CurrentWorkerProcesses,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.maximumWorkerProcesses,
|
||||
prometheus.GaugeValue,
|
||||
app[MaximumWorkerProcesses].FirstValue,
|
||||
name,
|
||||
data.MaximumWorkerProcesses,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.recentWorkerProcessFailures,
|
||||
prometheus.GaugeValue,
|
||||
app[RecentWorkerProcessFailures].FirstValue,
|
||||
name,
|
||||
data.RecentWorkerProcessFailures,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.timeSinceLastWorkerProcessFailure,
|
||||
prometheus.GaugeValue,
|
||||
app[TimeSinceLastWorkerProcessFailure].FirstValue,
|
||||
name,
|
||||
data.TimeSinceLastWorkerProcessFailure,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.totalApplicationPoolRecycles,
|
||||
prometheus.CounterValue,
|
||||
app[TotalApplicationPoolRecycles].FirstValue,
|
||||
name,
|
||||
data.TotalApplicationPoolRecycles,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.totalApplicationPoolUptime,
|
||||
prometheus.CounterValue,
|
||||
app[TotalApplicationPoolUptime].FirstValue,
|
||||
name,
|
||||
data.TotalApplicationPoolUptime,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.totalWorkerProcessesCreated,
|
||||
prometheus.CounterValue,
|
||||
app[TotalWorkerProcessesCreated].FirstValue,
|
||||
name,
|
||||
data.TotalWorkerProcessesCreated,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.totalWorkerProcessFailures,
|
||||
prometheus.CounterValue,
|
||||
app[TotalWorkerProcessFailures].FirstValue,
|
||||
name,
|
||||
data.TotalWorkerProcessFailures,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.totalWorkerProcessPingFailures,
|
||||
prometheus.CounterValue,
|
||||
app[TotalWorkerProcessPingFailures].FirstValue,
|
||||
name,
|
||||
data.TotalWorkerProcessPingFailures,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.totalWorkerProcessShutdownFailures,
|
||||
prometheus.CounterValue,
|
||||
app[TotalWorkerProcessShutdownFailures].FirstValue,
|
||||
name,
|
||||
data.TotalWorkerProcessShutdownFailures,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.totalWorkerProcessStartupFailures,
|
||||
prometheus.CounterValue,
|
||||
app[TotalWorkerProcessStartupFailures].FirstValue,
|
||||
name,
|
||||
data.TotalWorkerProcessStartupFailures,
|
||||
data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -20,13 +20,16 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorW3SVCW3WP struct {
|
||||
w3SVCW3WPPerfDataCollector *perfdata.Collector
|
||||
w3SVCW3WPPerfDataCollector *pdh.Collector
|
||||
w3SVCW3WPPerfDataCollectorV8 *pdh.Collector
|
||||
perfDataObjectW3SVCW3WP []perfDataCounterValuesW3SVCW3WP
|
||||
perfDataObjectW3SVCW3WPV8 []perfDataCounterValuesW3SVCW3WPV8
|
||||
|
||||
// W3SVC_W3WP
|
||||
w3SVCW3WPThreads *prometheus.Desc
|
||||
@@ -78,112 +81,85 @@ type collectorW3SVCW3WP struct {
|
||||
|
||||
var workerProcessNameExtractor = regexp.MustCompile(`^(\d+)_(.+)$`)
|
||||
|
||||
const (
|
||||
w3SVCW3WPThreads = "Active Threads Count"
|
||||
w3SVCW3WPMaximumThreads = "Maximum Threads Count"
|
||||
type perfDataCounterValuesW3SVCW3WP struct {
|
||||
Name string
|
||||
|
||||
w3SVCW3WPRequestsTotal = "Total HTTP Requests Served"
|
||||
w3SVCW3WPRequestsActive = "Active Requests"
|
||||
W3SVCW3WPThreads float64 `perfdata:"Active Threads Count"`
|
||||
W3SVCW3WPMaximumThreads float64 `perfdata:"Maximum Threads Count"`
|
||||
|
||||
w3SVCW3WPActiveFlushedEntries = "Active Flushed Entries"
|
||||
W3SVCW3WPRequestsTotal float64 `perfdata:"Total HTTP Requests Served"`
|
||||
W3SVCW3WPRequestsActive float64 `perfdata:"Active Requests"`
|
||||
|
||||
w3SVCW3WPCurrentFileCacheMemoryUsage = "Current File Cache Memory Usage"
|
||||
w3SVCW3WPMaximumFileCacheMemoryUsage = "Maximum File Cache Memory Usage"
|
||||
w3SVCW3WPFileCacheFlushesTotal = "File Cache Flushes"
|
||||
w3SVCW3WPFileCacheHitsTotal = "File Cache Hits"
|
||||
w3SVCW3WPFileCacheMissesTotal = "File Cache Misses"
|
||||
w3SVCW3WPFilesCached = "Current Files Cached"
|
||||
w3SVCW3WPFilesCachedTotal = "Total Files Cached"
|
||||
w3SVCW3WPFilesFlushedTotal = "Total Flushed Files"
|
||||
W3SVCW3WPActiveFlushedEntries float64 `perfdata:"Active Flushed Entries"`
|
||||
|
||||
w3SVCW3WPURICacheFlushesTotal = "Total Flushed URIs"
|
||||
w3SVCW3WPURICacheHitsTotal = "URI Cache Hits"
|
||||
w3SVCW3WPURICacheMissesTotal = "URI Cache Misses"
|
||||
w3SVCW3WPURIsCached = "Current URIs Cached"
|
||||
w3SVCW3WPURIsCachedTotal = "Total URIs Cached"
|
||||
w3SVCW3WPURIsFlushedTotal = "Total Flushed URIs"
|
||||
W3SVCW3WPCurrentFileCacheMemoryUsage float64 `perfdata:"Current File Cache Memory Usage"`
|
||||
W3SVCW3WPMaximumFileCacheMemoryUsage float64 `perfdata:"Maximum File Cache Memory Usage"`
|
||||
W3SVCW3WPFileCacheFlushesTotal float64 `perfdata:"File Cache Flushes"`
|
||||
W3SVCW3WPFileCacheHitsTotal float64 `perfdata:"File Cache Hits"`
|
||||
W3SVCW3WPFileCacheMissesTotal float64 `perfdata:"File Cache Misses"`
|
||||
W3SVCW3WPFilesCached float64 `perfdata:"Current Files Cached"`
|
||||
W3SVCW3WPFilesCachedTotal float64 `perfdata:"Total Files Cached"`
|
||||
W3SVCW3WPFilesFlushedTotal float64 `perfdata:"Total Flushed Files"`
|
||||
|
||||
w3SVCW3WPMetaDataCacheHits = "Metadata Cache Hits"
|
||||
w3SVCW3WPMetaDataCacheMisses = "Metadata Cache Misses"
|
||||
w3SVCW3WPMetadataCached = "Current Metadata Cached"
|
||||
w3SVCW3WPMetadataCacheFlushes = "Metadata Cache Flushes"
|
||||
w3SVCW3WPMetadataCachedTotal = "Total Metadata Cached"
|
||||
w3SVCW3WPMetadataFlushedTotal = "Total Flushed Metadata"
|
||||
W3SVCW3WPURICacheFlushesTotal float64 `perfdata:"Total Flushed URIs"`
|
||||
W3SVCW3WPURICacheHitsTotal float64 `perfdata:"URI Cache Hits"`
|
||||
W3SVCW3WPURICacheMissesTotal float64 `perfdata:"URI Cache Misses"`
|
||||
W3SVCW3WPURIsCached float64 `perfdata:"Current URIs Cached"`
|
||||
W3SVCW3WPURIsCachedTotal float64 `perfdata:"Total URIs Cached"`
|
||||
W3SVCW3WPURIsFlushedTotal float64 `perfdata:"Total Flushed URIs"`
|
||||
|
||||
w3SVCW3WPOutputCacheActiveFlushedItems = "Output Cache Current Flushed Items"
|
||||
w3SVCW3WPOutputCacheItems = "Output Cache Current Items"
|
||||
w3SVCW3WPOutputCacheMemoryUsage = "Output Cache Current Memory Usage"
|
||||
w3SVCW3WPOutputCacheHitsTotal = "Output Cache Total Hits"
|
||||
w3SVCW3WPOutputCacheMissesTotal = "Output Cache Total Misses"
|
||||
w3SVCW3WPOutputCacheFlushedItemsTotal = "Output Cache Total Flushed Items"
|
||||
w3SVCW3WPOutputCacheFlushesTotal = "Output Cache Total Flushes"
|
||||
W3SVCW3WPMetaDataCacheHits float64 `perfdata:"Metadata Cache Hits"`
|
||||
W3SVCW3WPMetaDataCacheMisses float64 `perfdata:"Metadata Cache Misses"`
|
||||
W3SVCW3WPMetadataCached float64 `perfdata:"Current Metadata Cached"`
|
||||
W3SVCW3WPMetadataCacheFlushes float64 `perfdata:"Metadata Cache Flushes"`
|
||||
W3SVCW3WPMetadataCachedTotal float64 `perfdata:"Total Metadata Cached"`
|
||||
W3SVCW3WPMetadataFlushedTotal float64 `perfdata:"Total Flushed Metadata"`
|
||||
|
||||
W3SVCW3WPOutputCacheActiveFlushedItems float64 `perfdata:"Output Cache Current Flushed Items"`
|
||||
W3SVCW3WPOutputCacheItems float64 `perfdata:"Output Cache Current Items"`
|
||||
W3SVCW3WPOutputCacheMemoryUsage float64 `perfdata:"Output Cache Current Memory Usage"`
|
||||
W3SVCW3WPOutputCacheHitsTotal float64 `perfdata:"Output Cache Total Hits"`
|
||||
W3SVCW3WPOutputCacheMissesTotal float64 `perfdata:"Output Cache Total Misses"`
|
||||
W3SVCW3WPOutputCacheFlushedItemsTotal float64 `perfdata:"Output Cache Total Flushed Items"`
|
||||
W3SVCW3WPOutputCacheFlushesTotal float64 `perfdata:"Output Cache Total Flushes"`
|
||||
}
|
||||
|
||||
func (p perfDataCounterValuesW3SVCW3WP) GetName() string {
|
||||
return p.Name
|
||||
}
|
||||
|
||||
type perfDataCounterValuesW3SVCW3WPV8 struct {
|
||||
Name string
|
||||
|
||||
// IIS8
|
||||
w3SVCW3WPRequestErrors500 = "% 500 HTTP Response Sent"
|
||||
w3SVCW3WPRequestErrors404 = "% 404 HTTP Response Sent"
|
||||
w3SVCW3WPRequestErrors403 = "% 403 HTTP Response Sent"
|
||||
w3SVCW3WPRequestErrors401 = "% 401 HTTP Response Sent"
|
||||
W3SVCW3WPRequestErrors500 float64 `perfdata:"% 500 HTTP Response Sent"`
|
||||
W3SVCW3WPRequestErrors404 float64 `perfdata:"% 404 HTTP Response Sent"`
|
||||
W3SVCW3WPRequestErrors403 float64 `perfdata:"% 403 HTTP Response Sent"`
|
||||
W3SVCW3WPRequestErrors401 float64 `perfdata:"% 401 HTTP Response Sent"`
|
||||
|
||||
w3SVCW3WPWebSocketRequestsActive = "WebSocket Active Requests"
|
||||
w3SVCW3WPWebSocketConnectionAttempts = "WebSocket Connection Attempts / Sec"
|
||||
w3SVCW3WPWebSocketConnectionsAccepted = "WebSocket Connections Accepted / Sec"
|
||||
w3SVCW3WPWebSocketConnectionsRejected = "WebSocket Connections Rejected / Sec"
|
||||
)
|
||||
W3SVCW3WPWebSocketRequestsActive float64 `perfdata:"WebSocket Active Requests"`
|
||||
W3SVCW3WPWebSocketConnectionAttempts float64 `perfdata:"WebSocket Connection Attempts / Sec"`
|
||||
W3SVCW3WPWebSocketConnectionsAccepted float64 `perfdata:"WebSocket Connections Accepted / Sec"`
|
||||
W3SVCW3WPWebSocketConnectionsRejected float64 `perfdata:"WebSocket Connections Rejected / Sec"`
|
||||
}
|
||||
|
||||
func (p perfDataCounterValuesW3SVCW3WPV8) GetName() string {
|
||||
return p.Name
|
||||
}
|
||||
|
||||
func (c *Collector) buildW3SVCW3WP() error {
|
||||
counters := []string{
|
||||
w3SVCW3WPThreads,
|
||||
w3SVCW3WPMaximumThreads,
|
||||
w3SVCW3WPRequestsTotal,
|
||||
w3SVCW3WPRequestsActive,
|
||||
w3SVCW3WPActiveFlushedEntries,
|
||||
w3SVCW3WPCurrentFileCacheMemoryUsage,
|
||||
w3SVCW3WPMaximumFileCacheMemoryUsage,
|
||||
w3SVCW3WPFileCacheFlushesTotal,
|
||||
w3SVCW3WPFileCacheHitsTotal,
|
||||
w3SVCW3WPFileCacheMissesTotal,
|
||||
w3SVCW3WPFilesCached,
|
||||
w3SVCW3WPFilesCachedTotal,
|
||||
w3SVCW3WPFilesFlushedTotal,
|
||||
w3SVCW3WPURICacheFlushesTotal,
|
||||
w3SVCW3WPURICacheHitsTotal,
|
||||
w3SVCW3WPURICacheMissesTotal,
|
||||
w3SVCW3WPURIsCached,
|
||||
w3SVCW3WPURIsCachedTotal,
|
||||
w3SVCW3WPURIsFlushedTotal,
|
||||
w3SVCW3WPMetaDataCacheHits,
|
||||
w3SVCW3WPMetaDataCacheMisses,
|
||||
w3SVCW3WPMetadataCached,
|
||||
w3SVCW3WPMetadataCacheFlushes,
|
||||
w3SVCW3WPMetadataCachedTotal,
|
||||
w3SVCW3WPMetadataFlushedTotal,
|
||||
w3SVCW3WPOutputCacheActiveFlushedItems,
|
||||
w3SVCW3WPOutputCacheItems,
|
||||
w3SVCW3WPOutputCacheMemoryUsage,
|
||||
w3SVCW3WPOutputCacheHitsTotal,
|
||||
w3SVCW3WPOutputCacheMissesTotal,
|
||||
w3SVCW3WPOutputCacheFlushedItemsTotal,
|
||||
w3SVCW3WPOutputCacheFlushesTotal,
|
||||
var err error
|
||||
|
||||
c.w3SVCW3WPPerfDataCollector, err = pdh.NewCollector[perfDataCounterValuesW3SVCW3WP]("W3SVC_W3WP", pdh.InstancesAll)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create W3SVC_W3WP collector: %w", err)
|
||||
}
|
||||
|
||||
if c.iisVersion.major >= 8 {
|
||||
counters = append(counters, []string{
|
||||
w3SVCW3WPRequestErrors500,
|
||||
w3SVCW3WPRequestErrors404,
|
||||
w3SVCW3WPRequestErrors403,
|
||||
w3SVCW3WPRequestErrors401,
|
||||
w3SVCW3WPWebSocketRequestsActive,
|
||||
w3SVCW3WPWebSocketConnectionAttempts,
|
||||
w3SVCW3WPWebSocketConnectionsAccepted,
|
||||
w3SVCW3WPWebSocketConnectionsRejected,
|
||||
}...)
|
||||
}
|
||||
|
||||
var err error
|
||||
|
||||
c.w3SVCW3WPPerfDataCollector, err = perfdata.NewCollector("W3SVC_W3WP", perfdata.InstancesAll, counters)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create W3SVC_W3WP collector: %w", err)
|
||||
c.w3SVCW3WPPerfDataCollectorV8, err = pdh.NewCollector[perfDataCounterValuesW3SVCW3WPV8]("W3SVC_W3WP", pdh.InstancesAll)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create W3SVC_W3WP collector: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// W3SVC_W3WP
|
||||
@@ -415,22 +391,128 @@ func (c *Collector) buildW3SVCW3WP() error {
|
||||
}
|
||||
|
||||
func (c *Collector) collectW3SVCW3WP(ch chan<- prometheus.Metric) error {
|
||||
perfData, err := c.w3SVCW3WPPerfDataCollector.Collect()
|
||||
if err := c.collectW3SVCW3WPv7(ch); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if c.iisVersion.major >= 8 {
|
||||
if err := c.collectW3SVCW3WPv8(ch); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Collector) collectW3SVCW3WPv8(ch chan<- prometheus.Metric) error {
|
||||
err := c.w3SVCW3WPPerfDataCollector.Collect(&c.perfDataObjectW3SVCW3WPV8)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect APP_POOL_WAS metrics: %w", err)
|
||||
}
|
||||
|
||||
deduplicateIISNames(perfData)
|
||||
deduplicateIISNames(c.perfDataObjectW3SVCW3WPV8)
|
||||
|
||||
for name, app := range perfData {
|
||||
if c.config.AppExclude.MatchString(name) || !c.config.AppInclude.MatchString(name) {
|
||||
for _, data := range c.perfDataObjectW3SVCW3WPV8 {
|
||||
if c.config.AppExclude.MatchString(data.Name) || !c.config.AppInclude.MatchString(data.Name) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Extract the apppool name from the format <PID>_<NAME>
|
||||
pid := workerProcessNameExtractor.ReplaceAllString(name, "$1")
|
||||
pid := workerProcessNameExtractor.ReplaceAllString(data.Name, "$1")
|
||||
|
||||
name := workerProcessNameExtractor.ReplaceAllString(name, "$2")
|
||||
name := workerProcessNameExtractor.ReplaceAllString(data.Name, "$2")
|
||||
if name == "" || c.config.AppExclude.MatchString(name) ||
|
||||
!c.config.AppInclude.MatchString(name) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Duplicate instances are suffixed # with an index number. These should be ignored
|
||||
if strings.Contains(name, "#") {
|
||||
continue
|
||||
}
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPRequestErrors401,
|
||||
name,
|
||||
pid,
|
||||
"401",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPRequestErrors403,
|
||||
name,
|
||||
pid,
|
||||
"403",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPRequestErrors404,
|
||||
name,
|
||||
pid,
|
||||
"404",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPRequestErrors500,
|
||||
name,
|
||||
pid,
|
||||
"500",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketRequestsActive,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPWebSocketRequestsActive,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketConnectionAttempts,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPWebSocketConnectionAttempts,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketConnectionsAccepted,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPWebSocketConnectionsAccepted,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketConnectionsRejected,
|
||||
prometheus.CounterValue,
|
||||
data.W3SVCW3WPWebSocketConnectionsRejected,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Collector) collectW3SVCW3WPv7(ch chan<- prometheus.Metric) error {
|
||||
err := c.w3SVCW3WPPerfDataCollector.Collect(&c.perfDataObjectW3SVCW3WP)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect APP_POOL_WAS metrics: %w", err)
|
||||
}
|
||||
|
||||
deduplicateIISNames(c.perfDataObjectW3SVCW3WP)
|
||||
|
||||
for _, data := range c.perfDataObjectW3SVCW3WP {
|
||||
if c.config.AppExclude.MatchString(data.Name) || !c.config.AppInclude.MatchString(data.Name) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Extract the apppool name from the format <PID>_<NAME>
|
||||
pid := workerProcessNameExtractor.ReplaceAllString(data.Name, "$1")
|
||||
|
||||
name := workerProcessNameExtractor.ReplaceAllString(data.Name, "$2")
|
||||
if name == "" || c.config.AppExclude.MatchString(name) ||
|
||||
!c.config.AppInclude.MatchString(name) {
|
||||
continue
|
||||
@@ -444,7 +526,7 @@ func (c *Collector) collectW3SVCW3WP(ch chan<- prometheus.Metric) error {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPThreads,
|
||||
prometheus.GaugeValue,
|
||||
app[w3SVCW3WPThreads].FirstValue,
|
||||
data.W3SVCW3WPThreads,
|
||||
name,
|
||||
pid,
|
||||
"busy",
|
||||
@@ -452,283 +534,220 @@ func (c *Collector) collectW3SVCW3WP(ch chan<- prometheus.Metric) error {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMaximumThreads,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPMaximumThreads].FirstValue,
|
||||
data.W3SVCW3WPMaximumThreads,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPRequestsTotal].FirstValue,
|
||||
data.W3SVCW3WPRequestsTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestsActive,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPRequestsActive].FirstValue,
|
||||
data.W3SVCW3WPRequestsActive,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPActiveFlushedEntries,
|
||||
prometheus.GaugeValue,
|
||||
app[w3SVCW3WPActiveFlushedEntries].FirstValue,
|
||||
data.W3SVCW3WPActiveFlushedEntries,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPCurrentFileCacheMemoryUsage,
|
||||
prometheus.GaugeValue,
|
||||
app[w3SVCW3WPCurrentFileCacheMemoryUsage].FirstValue,
|
||||
data.W3SVCW3WPCurrentFileCacheMemoryUsage,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMaximumFileCacheMemoryUsage,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPMaximumFileCacheMemoryUsage].FirstValue,
|
||||
data.W3SVCW3WPMaximumFileCacheMemoryUsage,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPFileCacheFlushesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPFileCacheFlushesTotal].FirstValue,
|
||||
data.W3SVCW3WPFileCacheFlushesTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPFileCacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPFileCacheHitsTotal].FirstValue+app[w3SVCW3WPFileCacheMissesTotal].FirstValue,
|
||||
data.W3SVCW3WPFileCacheHitsTotal+data.W3SVCW3WPFileCacheMissesTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPFileCacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPFileCacheHitsTotal].FirstValue,
|
||||
data.W3SVCW3WPFileCacheHitsTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPFilesCached,
|
||||
prometheus.GaugeValue,
|
||||
app[w3SVCW3WPFilesCached].FirstValue,
|
||||
data.W3SVCW3WPFilesCached,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPFilesCachedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPFilesCachedTotal].FirstValue,
|
||||
data.W3SVCW3WPFilesCachedTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPFilesFlushedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPFilesFlushedTotal].FirstValue,
|
||||
data.W3SVCW3WPFilesFlushedTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPURICacheFlushesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPURICacheFlushesTotal].FirstValue,
|
||||
data.W3SVCW3WPURICacheFlushesTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPURICacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPURICacheHitsTotal].FirstValue+app[w3SVCW3WPURICacheMissesTotal].FirstValue,
|
||||
data.W3SVCW3WPURICacheHitsTotal+data.W3SVCW3WPURICacheMissesTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPURICacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPURICacheHitsTotal].FirstValue,
|
||||
data.W3SVCW3WPURICacheHitsTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPURIsCached,
|
||||
prometheus.GaugeValue,
|
||||
app[w3SVCW3WPURIsCached].FirstValue,
|
||||
data.W3SVCW3WPURIsCached,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPURIsCachedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPURIsCachedTotal].FirstValue,
|
||||
data.W3SVCW3WPURIsCachedTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPURIsFlushedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPURIsFlushedTotal].FirstValue,
|
||||
data.W3SVCW3WPURIsFlushedTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMetadataCached,
|
||||
prometheus.GaugeValue,
|
||||
app[w3SVCW3WPMetadataCached].FirstValue,
|
||||
data.W3SVCW3WPMetadataCached,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMetadataCacheFlushes,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPMetadataCacheFlushes].FirstValue,
|
||||
data.W3SVCW3WPMetadataCacheFlushes,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMetadataCacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPMetaDataCacheHits].FirstValue+app[w3SVCW3WPMetaDataCacheMisses].FirstValue,
|
||||
data.W3SVCW3WPMetaDataCacheHits+data.W3SVCW3WPMetaDataCacheMisses,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMetadataCacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPMetaDataCacheHits].FirstValue,
|
||||
data.W3SVCW3WPMetaDataCacheHits,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMetadataCachedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPMetadataCachedTotal].FirstValue,
|
||||
data.W3SVCW3WPMetadataCachedTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPMetadataFlushedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPMetadataFlushedTotal].FirstValue,
|
||||
data.W3SVCW3WPMetadataFlushedTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPOutputCacheActiveFlushedItems,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPOutputCacheActiveFlushedItems].FirstValue,
|
||||
data.W3SVCW3WPOutputCacheActiveFlushedItems,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPOutputCacheItems,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPOutputCacheItems].FirstValue,
|
||||
data.W3SVCW3WPOutputCacheItems,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPOutputCacheMemoryUsage,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPOutputCacheMemoryUsage].FirstValue,
|
||||
data.W3SVCW3WPOutputCacheMemoryUsage,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPOutputCacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPOutputCacheHitsTotal].FirstValue+app[w3SVCW3WPOutputCacheMissesTotal].FirstValue,
|
||||
data.W3SVCW3WPOutputCacheHitsTotal+data.W3SVCW3WPOutputCacheMissesTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPOutputCacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPOutputCacheHitsTotal].FirstValue,
|
||||
data.W3SVCW3WPOutputCacheHitsTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPOutputCacheFlushedItemsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPOutputCacheFlushedItemsTotal].FirstValue,
|
||||
data.W3SVCW3WPOutputCacheFlushedItemsTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPOutputCacheFlushesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPOutputCacheFlushesTotal].FirstValue,
|
||||
data.W3SVCW3WPOutputCacheFlushesTotal,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
|
||||
if c.iisVersion.major >= 8 {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPRequestErrors401].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
"401",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPRequestErrors403].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
"403",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPRequestErrors404].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
"404",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPRequestErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPRequestErrors500].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
"500",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketRequestsActive,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPWebSocketRequestsActive].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketConnectionAttempts,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPWebSocketConnectionAttempts].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketConnectionsAccepted,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPWebSocketConnectionsAccepted].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.w3SVCW3WPWebSocketConnectionsRejected,
|
||||
prometheus.CounterValue,
|
||||
app[w3SVCW3WPWebSocketConnectionsRejected].FirstValue,
|
||||
name,
|
||||
pid,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -18,13 +18,14 @@ package iis
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorWebService struct {
|
||||
perfDataCollectorWebService *perfdata.Collector
|
||||
perfDataCollectorWebService *pdh.Collector
|
||||
perfDataObjectWebService []perfDataCounterValuesWebService
|
||||
|
||||
webServiceCurrentAnonymousUsers *prometheus.Desc
|
||||
webServiceCurrentBlockedAsyncIORequests *prometheus.Desc
|
||||
@@ -50,88 +51,56 @@ type collectorWebService struct {
|
||||
webServiceTotalRejectedAsyncIORequests *prometheus.Desc
|
||||
}
|
||||
|
||||
const (
|
||||
webServiceCurrentAnonymousUsers = "Current Anonymous Users"
|
||||
webServiceCurrentBlockedAsyncIORequests = "Current Blocked Async I/O Requests"
|
||||
webServiceCurrentCGIRequests = "Current CGI Requests"
|
||||
webServiceCurrentConnections = "Current Connections"
|
||||
webServiceCurrentISAPIExtensionRequests = "Current ISAPI Extension Requests"
|
||||
webServiceCurrentNonAnonymousUsers = "Current NonAnonymous Users"
|
||||
webServiceServiceUptime = "Service Uptime"
|
||||
webServiceTotalBytesReceived = "Total Bytes Received"
|
||||
webServiceTotalBytesSent = "Total Bytes Sent"
|
||||
webServiceTotalAnonymousUsers = "Total Anonymous Users"
|
||||
webServiceTotalBlockedAsyncIORequests = "Total Blocked Async I/O Requests"
|
||||
webServiceTotalCGIRequests = "Total CGI Requests"
|
||||
webServiceTotalConnectionAttemptsAllInstances = "Total Connection Attempts (all instances)"
|
||||
webServiceTotalFilesReceived = "Total Files Received"
|
||||
webServiceTotalFilesSent = "Total Files Sent"
|
||||
webServiceTotalISAPIExtensionRequests = "Total ISAPI Extension Requests"
|
||||
webServiceTotalLockedErrors = "Total Locked Errors"
|
||||
webServiceTotalLogonAttempts = "Total Logon Attempts"
|
||||
webServiceTotalNonAnonymousUsers = "Total NonAnonymous Users"
|
||||
webServiceTotalNotFoundErrors = "Total Not Found Errors"
|
||||
webServiceTotalRejectedAsyncIORequests = "Total Rejected Async I/O Requests"
|
||||
webServiceTotalCopyRequests = "Total Copy Requests"
|
||||
webServiceTotalDeleteRequests = "Total Delete Requests"
|
||||
webServiceTotalGetRequests = "Total Get Requests"
|
||||
webServiceTotalHeadRequests = "Total Head Requests"
|
||||
webServiceTotalLockRequests = "Total Lock Requests"
|
||||
webServiceTotalMkcolRequests = "Total Mkcol Requests"
|
||||
webServiceTotalMoveRequests = "Total Move Requests"
|
||||
webServiceTotalOptionsRequests = "Total Options Requests"
|
||||
webServiceTotalOtherRequests = "Total Other Request Methods"
|
||||
webServiceTotalPostRequests = "Total Post Requests"
|
||||
webServiceTotalPropfindRequests = "Total Propfind Requests"
|
||||
webServiceTotalProppatchRequests = "Total Proppatch Requests"
|
||||
webServiceTotalPutRequests = "Total Put Requests"
|
||||
webServiceTotalSearchRequests = "Total Search Requests"
|
||||
webServiceTotalTraceRequests = "Total Trace Requests"
|
||||
webServiceTotalUnlockRequests = "Total Unlock Requests"
|
||||
)
|
||||
type perfDataCounterValuesWebService struct {
|
||||
Name string
|
||||
|
||||
WebServiceCurrentAnonymousUsers float64 `perfdata:"Current Anonymous Users"`
|
||||
WebServiceCurrentBlockedAsyncIORequests float64 `perfdata:"Current Blocked Async I/O Requests"`
|
||||
WebServiceCurrentCGIRequests float64 `perfdata:"Current CGI Requests"`
|
||||
WebServiceCurrentConnections float64 `perfdata:"Current Connections"`
|
||||
WebServiceCurrentISAPIExtensionRequests float64 `perfdata:"Current ISAPI Extension Requests"`
|
||||
WebServiceCurrentNonAnonymousUsers float64 `perfdata:"Current NonAnonymous Users"`
|
||||
WebServiceServiceUptime float64 `perfdata:"Service Uptime"`
|
||||
WebServiceTotalBytesReceived float64 `perfdata:"Total Bytes Received"`
|
||||
WebServiceTotalBytesSent float64 `perfdata:"Total Bytes Sent"`
|
||||
WebServiceTotalAnonymousUsers float64 `perfdata:"Total Anonymous Users"`
|
||||
WebServiceTotalBlockedAsyncIORequests float64 `perfdata:"Total Blocked Async I/O Requests"`
|
||||
WebServiceTotalCGIRequests float64 `perfdata:"Total CGI Requests"`
|
||||
WebServiceTotalConnectionAttemptsAllInstances float64 `perfdata:"Total Connection Attempts (all instances)"`
|
||||
WebServiceTotalFilesReceived float64 `perfdata:"Total Files Received"`
|
||||
WebServiceTotalFilesSent float64 `perfdata:"Total Files Sent"`
|
||||
WebServiceTotalISAPIExtensionRequests float64 `perfdata:"Total ISAPI Extension Requests"`
|
||||
WebServiceTotalLockedErrors float64 `perfdata:"Total Locked Errors"`
|
||||
WebServiceTotalLogonAttempts float64 `perfdata:"Total Logon Attempts"`
|
||||
WebServiceTotalNonAnonymousUsers float64 `perfdata:"Total NonAnonymous Users"`
|
||||
WebServiceTotalNotFoundErrors float64 `perfdata:"Total Not Found Errors"`
|
||||
WebServiceTotalRejectedAsyncIORequests float64 `perfdata:"Total Rejected Async I/O Requests"`
|
||||
WebServiceTotalCopyRequests float64 `perfdata:"Total Copy Requests"`
|
||||
WebServiceTotalDeleteRequests float64 `perfdata:"Total Delete Requests"`
|
||||
WebServiceTotalGetRequests float64 `perfdata:"Total Get Requests"`
|
||||
WebServiceTotalHeadRequests float64 `perfdata:"Total Head Requests"`
|
||||
WebServiceTotalLockRequests float64 `perfdata:"Total Lock Requests"`
|
||||
WebServiceTotalMkcolRequests float64 `perfdata:"Total Mkcol Requests"`
|
||||
WebServiceTotalMoveRequests float64 `perfdata:"Total Move Requests"`
|
||||
WebServiceTotalOptionsRequests float64 `perfdata:"Total Options Requests"`
|
||||
WebServiceTotalOtherRequests float64 `perfdata:"Total Other Request Methods"`
|
||||
WebServiceTotalPostRequests float64 `perfdata:"Total Post Requests"`
|
||||
WebServiceTotalPropfindRequests float64 `perfdata:"Total Propfind Requests"`
|
||||
WebServiceTotalProppatchRequests float64 `perfdata:"Total Proppatch Requests"`
|
||||
WebServiceTotalPutRequests float64 `perfdata:"Total Put Requests"`
|
||||
WebServiceTotalSearchRequests float64 `perfdata:"Total Search Requests"`
|
||||
WebServiceTotalTraceRequests float64 `perfdata:"Total Trace Requests"`
|
||||
WebServiceTotalUnlockRequests float64 `perfdata:"Total Unlock Requests"`
|
||||
}
|
||||
|
||||
func (p perfDataCounterValuesWebService) GetName() string {
|
||||
return p.Name
|
||||
}
|
||||
|
||||
func (c *Collector) buildWebService() error {
|
||||
var err error
|
||||
|
||||
c.perfDataCollectorWebService, err = perfdata.NewCollector("Web Service", perfdata.InstancesAll, []string{
|
||||
webServiceCurrentAnonymousUsers,
|
||||
webServiceCurrentBlockedAsyncIORequests,
|
||||
webServiceCurrentCGIRequests,
|
||||
webServiceCurrentConnections,
|
||||
webServiceCurrentISAPIExtensionRequests,
|
||||
webServiceCurrentNonAnonymousUsers,
|
||||
webServiceServiceUptime,
|
||||
webServiceTotalBytesReceived,
|
||||
webServiceTotalBytesSent,
|
||||
webServiceTotalAnonymousUsers,
|
||||
webServiceTotalBlockedAsyncIORequests,
|
||||
webServiceTotalCGIRequests,
|
||||
webServiceTotalConnectionAttemptsAllInstances,
|
||||
webServiceTotalFilesReceived,
|
||||
webServiceTotalFilesSent,
|
||||
webServiceTotalISAPIExtensionRequests,
|
||||
webServiceTotalLockedErrors,
|
||||
webServiceTotalLogonAttempts,
|
||||
webServiceTotalNonAnonymousUsers,
|
||||
webServiceTotalNotFoundErrors,
|
||||
webServiceTotalRejectedAsyncIORequests,
|
||||
webServiceTotalCopyRequests,
|
||||
webServiceTotalDeleteRequests,
|
||||
webServiceTotalGetRequests,
|
||||
webServiceTotalHeadRequests,
|
||||
webServiceTotalLockRequests,
|
||||
webServiceTotalMkcolRequests,
|
||||
webServiceTotalMoveRequests,
|
||||
webServiceTotalOptionsRequests,
|
||||
webServiceTotalOtherRequests,
|
||||
webServiceTotalPostRequests,
|
||||
webServiceTotalPropfindRequests,
|
||||
webServiceTotalProppatchRequests,
|
||||
webServiceTotalPutRequests,
|
||||
webServiceTotalSearchRequests,
|
||||
webServiceTotalTraceRequests,
|
||||
webServiceTotalUnlockRequests,
|
||||
})
|
||||
c.perfDataCollectorWebService, err = pdh.NewCollector[perfDataCounterValuesWebService]("Web Service", pdh.InstancesAll)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create Web Service collector: %w", err)
|
||||
}
|
||||
@@ -273,254 +242,254 @@ func (c *Collector) buildWebService() error {
|
||||
}
|
||||
|
||||
func (c *Collector) collectWebService(ch chan<- prometheus.Metric) error {
|
||||
perfData, err := c.perfDataCollectorWebService.Collect()
|
||||
err := c.perfDataCollectorWebService.Collect(&c.perfDataObjectWebService)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect Web Service metrics: %w", err)
|
||||
}
|
||||
|
||||
deduplicateIISNames(perfData)
|
||||
deduplicateIISNames(c.perfDataObjectWebService)
|
||||
|
||||
for name, app := range perfData {
|
||||
if c.config.SiteExclude.MatchString(name) || !c.config.SiteInclude.MatchString(name) {
|
||||
for _, data := range c.perfDataObjectWebService {
|
||||
if c.config.SiteExclude.MatchString(data.Name) || !c.config.SiteInclude.MatchString(data.Name) {
|
||||
continue
|
||||
}
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceCurrentAnonymousUsers,
|
||||
prometheus.GaugeValue,
|
||||
app[webServiceCurrentAnonymousUsers].FirstValue,
|
||||
name,
|
||||
data.WebServiceCurrentAnonymousUsers,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceCurrentBlockedAsyncIORequests,
|
||||
prometheus.GaugeValue,
|
||||
app[webServiceCurrentBlockedAsyncIORequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceCurrentBlockedAsyncIORequests,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceCurrentCGIRequests,
|
||||
prometheus.GaugeValue,
|
||||
app[webServiceCurrentCGIRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceCurrentCGIRequests,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceCurrentConnections,
|
||||
prometheus.GaugeValue,
|
||||
app[webServiceCurrentConnections].FirstValue,
|
||||
name,
|
||||
data.WebServiceCurrentConnections,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceCurrentISAPIExtensionRequests,
|
||||
prometheus.GaugeValue,
|
||||
app[webServiceCurrentISAPIExtensionRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceCurrentISAPIExtensionRequests,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceCurrentNonAnonymousUsers,
|
||||
prometheus.GaugeValue,
|
||||
app[webServiceCurrentNonAnonymousUsers].FirstValue,
|
||||
name,
|
||||
data.WebServiceCurrentNonAnonymousUsers,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceServiceUptime,
|
||||
prometheus.GaugeValue,
|
||||
app[webServiceServiceUptime].FirstValue,
|
||||
name,
|
||||
data.WebServiceServiceUptime,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalBytesReceived,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalBytesReceived].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalBytesReceived,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalBytesSent,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalBytesSent].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalBytesSent,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalAnonymousUsers,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalAnonymousUsers].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalAnonymousUsers,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalBlockedAsyncIORequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalBlockedAsyncIORequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalBlockedAsyncIORequests,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalCGIRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalCGIRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalCGIRequests,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalConnectionAttemptsAllInstances,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalConnectionAttemptsAllInstances].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalConnectionAttemptsAllInstances,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalFilesReceived,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalFilesReceived].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalFilesReceived,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalFilesSent,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalFilesSent].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalFilesSent,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalISAPIExtensionRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalISAPIExtensionRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalISAPIExtensionRequests,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalLockedErrors,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalLockedErrors].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalLockedErrors,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalLogonAttempts,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalLogonAttempts].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalLogonAttempts,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalNonAnonymousUsers,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalNonAnonymousUsers].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalNonAnonymousUsers,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalNotFoundErrors,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalNotFoundErrors].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalNotFoundErrors,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRejectedAsyncIORequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalRejectedAsyncIORequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalRejectedAsyncIORequests,
|
||||
data.Name,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalOtherRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalOtherRequests,
|
||||
data.Name,
|
||||
"other",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalCopyRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalCopyRequests,
|
||||
data.Name,
|
||||
"COPY",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalDeleteRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalDeleteRequests,
|
||||
data.Name,
|
||||
"DELETE",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalGetRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalGetRequests,
|
||||
data.Name,
|
||||
"GET",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalHeadRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalHeadRequests,
|
||||
data.Name,
|
||||
"HEAD",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalLockRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalLockRequests,
|
||||
data.Name,
|
||||
"LOCK",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalMkcolRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalMkcolRequests,
|
||||
data.Name,
|
||||
"MKCOL",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalMoveRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalMoveRequests,
|
||||
data.Name,
|
||||
"MOVE",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalOptionsRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalOptionsRequests,
|
||||
data.Name,
|
||||
"OPTIONS",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalPostRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalPostRequests,
|
||||
data.Name,
|
||||
"POST",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalPropfindRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalPropfindRequests,
|
||||
data.Name,
|
||||
"PROPFIND",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalProppatchRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalProppatchRequests,
|
||||
data.Name,
|
||||
"PROPPATCH",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalPutRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalPutRequests,
|
||||
data.Name,
|
||||
"PUT",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalSearchRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalSearchRequests,
|
||||
data.Name,
|
||||
"SEARCH",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalTraceRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalTraceRequests,
|
||||
data.Name,
|
||||
"TRACE",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.webServiceTotalRequests,
|
||||
prometheus.CounterValue,
|
||||
app[webServiceTotalUnlockRequests].FirstValue,
|
||||
name,
|
||||
data.WebServiceTotalUnlockRequests,
|
||||
data.Name,
|
||||
"UNLOCK",
|
||||
)
|
||||
}
|
||||
|
||||
@@ -18,13 +18,14 @@ package iis
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorWebServiceCache struct {
|
||||
serviceCachePerfDataCollector *perfdata.Collector
|
||||
serviceCachePerfDataCollector *pdh.Collector
|
||||
perfDataObjectServiceCache []perfDataCounterServiceCache
|
||||
|
||||
serviceCacheActiveFlushedEntries *prometheus.Desc
|
||||
|
||||
@@ -60,82 +61,53 @@ type collectorWebServiceCache struct {
|
||||
serviceCacheOutputCacheFlushesTotal *prometheus.Desc
|
||||
}
|
||||
|
||||
const (
|
||||
serviceCacheActiveFlushedEntries = "Active Flushed Entries"
|
||||
serviceCacheCurrentFileCacheMemoryUsage = "Current File Cache Memory Usage"
|
||||
serviceCacheMaximumFileCacheMemoryUsage = "Maximum File Cache Memory Usage"
|
||||
serviceCacheFileCacheFlushesTotal = "File Cache Flushes"
|
||||
serviceCacheFileCacheHitsTotal = "File Cache Hits"
|
||||
serviceCacheFileCacheMissesTotal = "File Cache Misses"
|
||||
serviceCacheFilesCached = "Current Files Cached"
|
||||
serviceCacheFilesCachedTotal = "Total Files Cached"
|
||||
serviceCacheFilesFlushedTotal = "Total Flushed Files"
|
||||
serviceCacheURICacheFlushesTotal = "Total Flushed URIs"
|
||||
serviceCacheURICacheFlushesTotalKernel = "Total Flushed URIs"
|
||||
serviceCacheURIsFlushedTotalKernel = "Kernel: Total Flushed URIs"
|
||||
serviceCacheURICacheHitsTotal = "URI Cache Hits"
|
||||
serviceCacheURICacheHitsTotalKernel = "Kernel: URI Cache Hits"
|
||||
serviceCacheURICacheMissesTotal = "URI Cache Misses"
|
||||
serviceCacheURICacheMissesTotalKernel = "Kernel: URI Cache Misses"
|
||||
serviceCacheURIsCached = "Current URIs Cached"
|
||||
serviceCacheURIsCachedKernel = "Kernel: Current URIs Cached"
|
||||
serviceCacheURIsCachedTotal = "Total URIs Cached"
|
||||
serviceCacheURIsCachedTotalKernel = "Total URIs Cached"
|
||||
serviceCacheURIsFlushedTotal = "Total Flushed URIs"
|
||||
serviceCacheMetaDataCacheHits = "Metadata Cache Hits"
|
||||
serviceCacheMetaDataCacheMisses = "Metadata Cache Misses"
|
||||
serviceCacheMetadataCached = "Current Metadata Cached"
|
||||
serviceCacheMetadataCacheFlushes = "Metadata Cache Flushes"
|
||||
serviceCacheMetadataCachedTotal = "Total Metadata Cached"
|
||||
serviceCacheMetadataFlushedTotal = "Total Flushed Metadata"
|
||||
serviceCacheOutputCacheActiveFlushedItems = "Output Cache Current Flushed Items"
|
||||
serviceCacheOutputCacheItems = "Output Cache Current Items"
|
||||
serviceCacheOutputCacheMemoryUsage = "Output Cache Current Memory Usage"
|
||||
serviceCacheOutputCacheHitsTotal = "Output Cache Total Hits"
|
||||
serviceCacheOutputCacheMissesTotal = "Output Cache Total Misses"
|
||||
serviceCacheOutputCacheFlushedItemsTotal = "Output Cache Total Flushed Items"
|
||||
serviceCacheOutputCacheFlushesTotal = "Output Cache Total Flushes"
|
||||
)
|
||||
type perfDataCounterServiceCache struct {
|
||||
Name string
|
||||
|
||||
ServiceCacheActiveFlushedEntries float64 `perfdata:"Active Flushed Entries"`
|
||||
ServiceCacheCurrentFileCacheMemoryUsage float64 `perfdata:"Current File Cache Memory Usage"`
|
||||
ServiceCacheMaximumFileCacheMemoryUsage float64 `perfdata:"Maximum File Cache Memory Usage"`
|
||||
ServiceCacheFileCacheFlushesTotal float64 `perfdata:"File Cache Flushes"`
|
||||
ServiceCacheFileCacheHitsTotal float64 `perfdata:"File Cache Hits"`
|
||||
ServiceCacheFileCacheMissesTotal float64 `perfdata:"File Cache Misses"`
|
||||
ServiceCacheFilesCached float64 `perfdata:"Current Files Cached"`
|
||||
ServiceCacheFilesCachedTotal float64 `perfdata:"Total Files Cached"`
|
||||
ServiceCacheFilesFlushedTotal float64 `perfdata:"Total Flushed Files"`
|
||||
ServiceCacheURICacheFlushesTotal float64 `perfdata:"Total Flushed URIs"`
|
||||
ServiceCacheURICacheFlushesTotalKernel float64 `perfdata:"Total Flushed URIs"`
|
||||
ServiceCacheURIsFlushedTotalKernel float64 `perfdata:"Kernel: Total Flushed URIs"`
|
||||
ServiceCacheURICacheHitsTotal float64 `perfdata:"URI Cache Hits"`
|
||||
ServiceCacheURICacheHitsTotalKernel float64 `perfdata:"Kernel: URI Cache Hits"`
|
||||
ServiceCacheURICacheMissesTotal float64 `perfdata:"URI Cache Misses"`
|
||||
ServiceCacheURICacheMissesTotalKernel float64 `perfdata:"Kernel: URI Cache Misses"`
|
||||
ServiceCacheURIsCached float64 `perfdata:"Current URIs Cached"`
|
||||
ServiceCacheURIsCachedKernel float64 `perfdata:"Kernel: Current URIs Cached"`
|
||||
ServiceCacheURIsCachedTotal float64 `perfdata:"Total URIs Cached"`
|
||||
ServiceCacheURIsCachedTotalKernel float64 `perfdata:"Total URIs Cached"`
|
||||
ServiceCacheURIsFlushedTotal float64 `perfdata:"Total Flushed URIs"`
|
||||
ServiceCacheMetaDataCacheHits float64 `perfdata:"Metadata Cache Hits"`
|
||||
ServiceCacheMetaDataCacheMisses float64 `perfdata:"Metadata Cache Misses"`
|
||||
ServiceCacheMetadataCached float64 `perfdata:"Current Metadata Cached"`
|
||||
ServiceCacheMetadataCacheFlushes float64 `perfdata:"Metadata Cache Flushes"`
|
||||
ServiceCacheMetadataCachedTotal float64 `perfdata:"Total Metadata Cached"`
|
||||
ServiceCacheMetadataFlushedTotal float64 `perfdata:"Total Flushed Metadata"`
|
||||
ServiceCacheOutputCacheActiveFlushedItems float64 `perfdata:"Output Cache Current Flushed Items"`
|
||||
ServiceCacheOutputCacheItems float64 `perfdata:"Output Cache Current Items"`
|
||||
ServiceCacheOutputCacheMemoryUsage float64 `perfdata:"Output Cache Current Memory Usage"`
|
||||
ServiceCacheOutputCacheHitsTotal float64 `perfdata:"Output Cache Total Hits"`
|
||||
ServiceCacheOutputCacheMissesTotal float64 `perfdata:"Output Cache Total Misses"`
|
||||
ServiceCacheOutputCacheFlushedItemsTotal float64 `perfdata:"Output Cache Total Flushed Items"`
|
||||
ServiceCacheOutputCacheFlushesTotal float64 `perfdata:"Output Cache Total Flushes"`
|
||||
}
|
||||
|
||||
func (p perfDataCounterServiceCache) GetName() string {
|
||||
return p.Name
|
||||
}
|
||||
|
||||
func (c *Collector) buildWebServiceCache() error {
|
||||
var err error
|
||||
|
||||
c.serviceCachePerfDataCollector, err = perfdata.NewCollector("Web Service Cache", perfdata.InstancesAll, []string{
|
||||
serviceCacheActiveFlushedEntries,
|
||||
serviceCacheCurrentFileCacheMemoryUsage,
|
||||
serviceCacheMaximumFileCacheMemoryUsage,
|
||||
serviceCacheFileCacheFlushesTotal,
|
||||
serviceCacheFileCacheHitsTotal,
|
||||
serviceCacheFileCacheMissesTotal,
|
||||
serviceCacheFilesCached,
|
||||
serviceCacheFilesCachedTotal,
|
||||
serviceCacheFilesFlushedTotal,
|
||||
serviceCacheURICacheFlushesTotal,
|
||||
serviceCacheURICacheFlushesTotalKernel,
|
||||
serviceCacheURIsFlushedTotalKernel,
|
||||
serviceCacheURICacheHitsTotal,
|
||||
serviceCacheURICacheHitsTotalKernel,
|
||||
serviceCacheURICacheMissesTotal,
|
||||
serviceCacheURICacheMissesTotalKernel,
|
||||
serviceCacheURIsCached,
|
||||
serviceCacheURIsCachedKernel,
|
||||
serviceCacheURIsCachedTotal,
|
||||
serviceCacheURIsCachedTotalKernel,
|
||||
serviceCacheURIsFlushedTotal,
|
||||
serviceCacheMetaDataCacheHits,
|
||||
serviceCacheMetaDataCacheMisses,
|
||||
serviceCacheMetadataCached,
|
||||
serviceCacheMetadataCacheFlushes,
|
||||
serviceCacheMetadataCachedTotal,
|
||||
serviceCacheMetadataFlushedTotal,
|
||||
serviceCacheOutputCacheActiveFlushedItems,
|
||||
serviceCacheOutputCacheItems,
|
||||
serviceCacheOutputCacheMemoryUsage,
|
||||
serviceCacheOutputCacheHitsTotal,
|
||||
serviceCacheOutputCacheMissesTotal,
|
||||
serviceCacheOutputCacheFlushedItemsTotal,
|
||||
serviceCacheOutputCacheFlushesTotal,
|
||||
})
|
||||
c.serviceCachePerfDataCollector, err = pdh.NewCollector[perfDataCounterServiceCache]("Web Service Cache", pdh.InstancesAll)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create Web Service Cache collector: %w", err)
|
||||
}
|
||||
@@ -314,199 +286,199 @@ func (c *Collector) buildWebServiceCache() error {
|
||||
}
|
||||
|
||||
func (c *Collector) collectWebServiceCache(ch chan<- prometheus.Metric) error {
|
||||
perfData, err := c.serviceCachePerfDataCollector.Collect()
|
||||
err := c.serviceCachePerfDataCollector.Collect(&c.perfDataObjectServiceCache)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect Web Service Cache metrics: %w", err)
|
||||
}
|
||||
|
||||
deduplicateIISNames(perfData)
|
||||
deduplicateIISNames(c.perfDataObjectServiceCache)
|
||||
|
||||
for name, app := range perfData {
|
||||
if c.config.SiteExclude.MatchString(name) || !c.config.SiteInclude.MatchString(name) {
|
||||
for _, data := range c.perfDataObjectServiceCache {
|
||||
if c.config.SiteExclude.MatchString(data.Name) || !c.config.SiteInclude.MatchString(data.Name) {
|
||||
continue
|
||||
}
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheActiveFlushedEntries,
|
||||
prometheus.GaugeValue,
|
||||
app[serviceCacheActiveFlushedEntries].FirstValue,
|
||||
data.ServiceCacheActiveFlushedEntries,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheCurrentFileCacheMemoryUsage,
|
||||
prometheus.GaugeValue,
|
||||
app[serviceCacheCurrentFileCacheMemoryUsage].FirstValue,
|
||||
data.ServiceCacheCurrentFileCacheMemoryUsage,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheMaximumFileCacheMemoryUsage,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheMaximumFileCacheMemoryUsage].FirstValue,
|
||||
data.ServiceCacheMaximumFileCacheMemoryUsage,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheFileCacheFlushesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheFileCacheFlushesTotal].FirstValue,
|
||||
data.ServiceCacheFileCacheFlushesTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheFileCacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheFileCacheHitsTotal].FirstValue+app[serviceCacheFileCacheMissesTotal].FirstValue,
|
||||
data.ServiceCacheFileCacheHitsTotal+data.ServiceCacheFileCacheMissesTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheFileCacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheFileCacheHitsTotal].FirstValue,
|
||||
data.ServiceCacheFileCacheHitsTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheFilesCached,
|
||||
prometheus.GaugeValue,
|
||||
app[serviceCacheFilesCached].FirstValue,
|
||||
data.ServiceCacheFilesCached,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheFilesCachedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheFilesCachedTotal].FirstValue,
|
||||
data.ServiceCacheFilesCachedTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheFilesFlushedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheFilesFlushedTotal].FirstValue,
|
||||
data.ServiceCacheFilesFlushedTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURICacheFlushesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURICacheFlushesTotal].FirstValue,
|
||||
data.ServiceCacheURICacheFlushesTotal,
|
||||
"user",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURICacheFlushesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURICacheFlushesTotalKernel].FirstValue,
|
||||
data.ServiceCacheURICacheFlushesTotalKernel,
|
||||
"kernel",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURICacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURICacheHitsTotal].FirstValue+app[serviceCacheURICacheMissesTotal].FirstValue,
|
||||
data.ServiceCacheURICacheHitsTotal+data.ServiceCacheURICacheMissesTotal,
|
||||
"user",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURICacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURICacheHitsTotalKernel].FirstValue+app[serviceCacheURICacheMissesTotalKernel].FirstValue,
|
||||
data.ServiceCacheURICacheHitsTotalKernel+data.ServiceCacheURICacheMissesTotalKernel,
|
||||
"kernel",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURICacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURICacheHitsTotal].FirstValue,
|
||||
data.ServiceCacheURICacheHitsTotal,
|
||||
"user",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURICacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURICacheHitsTotalKernel].FirstValue,
|
||||
data.ServiceCacheURICacheHitsTotalKernel,
|
||||
"kernel",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURIsCached,
|
||||
prometheus.GaugeValue,
|
||||
app[serviceCacheURIsCached].FirstValue,
|
||||
data.ServiceCacheURIsCached,
|
||||
"user",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURIsCached,
|
||||
prometheus.GaugeValue,
|
||||
app[serviceCacheURIsCachedKernel].FirstValue,
|
||||
data.ServiceCacheURIsCachedKernel,
|
||||
"kernel",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURIsCachedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURIsCachedTotal].FirstValue,
|
||||
data.ServiceCacheURIsCachedTotal,
|
||||
"user",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURIsCachedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURIsCachedTotalKernel].FirstValue,
|
||||
data.ServiceCacheURIsCachedTotalKernel,
|
||||
"kernel",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURIsFlushedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURIsFlushedTotal].FirstValue,
|
||||
data.ServiceCacheURIsFlushedTotal,
|
||||
"user",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheURIsFlushedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheURIsFlushedTotalKernel].FirstValue,
|
||||
data.ServiceCacheURIsFlushedTotalKernel,
|
||||
"kernel",
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheMetadataCached,
|
||||
prometheus.GaugeValue,
|
||||
app[serviceCacheMetadataCached].FirstValue,
|
||||
data.ServiceCacheMetadataCached,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheMetadataCacheFlushes,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheMetadataCacheFlushes].FirstValue,
|
||||
data.ServiceCacheMetadataCacheFlushes,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheMetadataCacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheMetaDataCacheHits].FirstValue+app[serviceCacheMetaDataCacheMisses].FirstValue,
|
||||
data.ServiceCacheMetaDataCacheHits+data.ServiceCacheMetaDataCacheMisses,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheMetadataCacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
0, // app[serviceCacheMetadataCacheHitsTotal].FirstValue,
|
||||
0, // data.ServiceCacheMetadataCacheHitsTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheMetadataCachedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheMetadataCachedTotal].FirstValue,
|
||||
data.ServiceCacheMetadataCachedTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheMetadataFlushedTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheMetadataFlushedTotal].FirstValue,
|
||||
data.ServiceCacheMetadataFlushedTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheOutputCacheActiveFlushedItems,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheOutputCacheActiveFlushedItems].FirstValue,
|
||||
data.ServiceCacheOutputCacheActiveFlushedItems,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheOutputCacheItems,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheOutputCacheItems].FirstValue,
|
||||
data.ServiceCacheOutputCacheItems,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheOutputCacheMemoryUsage,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheOutputCacheMemoryUsage].FirstValue,
|
||||
data.ServiceCacheOutputCacheMemoryUsage,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheOutputCacheQueriesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheOutputCacheHitsTotal].FirstValue+app[serviceCacheOutputCacheMissesTotal].FirstValue,
|
||||
data.ServiceCacheOutputCacheHitsTotal+data.ServiceCacheOutputCacheMissesTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheOutputCacheHitsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheOutputCacheHitsTotal].FirstValue,
|
||||
data.ServiceCacheOutputCacheHitsTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheOutputCacheFlushedItemsTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheOutputCacheFlushedItemsTotal].FirstValue,
|
||||
data.ServiceCacheOutputCacheFlushedItemsTotal,
|
||||
)
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.serviceCacheOutputCacheFlushesTotal,
|
||||
prometheus.CounterValue,
|
||||
app[serviceCacheOutputCacheFlushesTotal].FirstValue,
|
||||
data.ServiceCacheOutputCacheFlushesTotal,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user