Skip to content
This repository has been archived by the owner on Mar 27, 2024. It is now read-only.

IIS Metrics #972

Merged
merged 18 commits into from
Nov 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 66 additions & 52 deletions modules/wmi/README.md

Large diffs are not rendered by default.

185 changes: 185 additions & 0 deletions modules/wmi/charts.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,18 @@ const (
prioProcessesThreads
prioProcessesHandles

prioIISWebsiteTraffic
prioIISWebsiteRequestsRate
prioIISWebsiteActiveConnectionsCount
prioIISWebsiteUsersCount
prioIISWebsiteConnectionAttemptsRate
prioIISWebsiteISAPIExtRequestsCount
prioIISWebsiteISAPIExtRequestsRate
prioIISWebsiteFTPFileTransferRate
prioIISWebsiteLogonAttemptsRate
prioIISWebsiteErrorsRate
prioIISWebsiteUptime

prioServiceState
prioServiceStatus

Expand Down Expand Up @@ -598,6 +610,151 @@ var (
}
)

// IIS
var (
iisWebsiteChartsTmpl = module.Charts{
iisWebsiteTrafficChartTempl.Copy(),
iisWebsiteRequestsRateChartTmpl.Copy(),
iisWebsiteActiveConnectionsCountChartTmpl.Copy(),
iisWebsiteUsersCountChartTmpl.Copy(),
iisWebsiteConnectionAttemptsRate.Copy(),
iisWebsiteISAPIExtRequestsCountChartTmpl.Copy(),
iisWebsiteISAPIExtRequestsRateChartTmpl.Copy(),
iisWebsiteFTPFileTransferRateChartTempl.Copy(),
iisWebsiteLogonAttemptsRateChartTmpl.Copy(),
iisWebsiteErrorsRateChart.Copy(),
iisWebsiteUptimeChartTmpl.Copy(),
}
iisWebsiteTrafficChartTempl = module.Chart{
ID: "iis_website_%s_traffic",
Title: "Website traffic",
Units: "bytes/s",
Fam: "iis",
Ctx: "wmi.iis_website_traffic",
Type: module.Area,
Priority: prioIISWebsiteTraffic,
Dims: module.Dims{
{ID: "iis_website_%s_received_bytes_total", Name: "received", Algo: module.Incremental},
{ID: "iis_website_%s_sent_bytes_total", Name: "sent", Algo: module.Incremental, Mul: -1},
},
}
iisWebsiteRequestsRateChartTmpl = module.Chart{
ID: "iis_website_%s_requests_rate",
Title: "Website requests rate",
Units: "requests/s",
Fam: "iis",
Ctx: "wmi.iis_website_requests_rate",
Priority: prioIISWebsiteRequestsRate,
Dims: module.Dims{
{ID: "iis_website_%s_requests_total", Name: "requests", Algo: module.Incremental},
},
}
iisWebsiteActiveConnectionsCountChartTmpl = module.Chart{
ID: "iis_website_%s_active_connections_count",
Title: "Website active connections",
Units: "connections",
Fam: "iis",
Ctx: "wmi.iis_website_active_connections_count",
Priority: prioIISWebsiteActiveConnectionsCount,
Dims: module.Dims{
{ID: "iis_website_%s_current_connections", Name: "active"},
},
}
iisWebsiteUsersCountChartTmpl = module.Chart{
ID: "iis_website_%s_users_count",
Title: "Website users with pending requests",
Units: "users",
Fam: "iis",
Ctx: "wmi.iis_website_users_count",
Type: module.Stacked,
Priority: prioIISWebsiteUsersCount,
Dims: module.Dims{
{ID: "iis_website_%s_current_anonymous_users", Name: "anonymous"},
{ID: "iis_website_%s_current_non_anonymous_users", Name: "non_anonymous"},
},
}
iisWebsiteConnectionAttemptsRate = module.Chart{
ID: "iis_website_%s_connection_attempts_rate",
Title: "Website connections attempts",
Units: "attempts/s",
Fam: "iis",
Ctx: "wmi.iis_website_connection_attempts_rate",
Priority: prioIISWebsiteConnectionAttemptsRate,
Dims: module.Dims{
{ID: "iis_website_%s_connection_attempts_all_instances_total", Name: "connection", Algo: module.Incremental},
},
}
iisWebsiteISAPIExtRequestsCountChartTmpl = module.Chart{
ID: "iis_website_%s_isapi_extension_requests_count",
Title: "ISAPI extension requests",
Units: "requests",
Fam: "iis",
Ctx: "wmi.iis_website_isapi_extension_requests_count",
Priority: prioIISWebsiteISAPIExtRequestsCount,
Dims: module.Dims{
{ID: "iis_website_%s_current_isapi_extension_requests", Name: "isapi"},
},
}
iisWebsiteISAPIExtRequestsRateChartTmpl = module.Chart{
ID: "iis_website_%s_isapi_extension_requests_rate",
Title: "Website extensions request",
Units: "requests/s",
Fam: "iis",
Ctx: "wmi.iis_website_isapi_extension_requests_rate",
Priority: prioIISWebsiteISAPIExtRequestsRate,
Dims: module.Dims{
{ID: "iis_website_%s_isapi_extension_requests_total", Name: "isapi", Algo: module.Incremental},
},
}
iisWebsiteFTPFileTransferRateChartTempl = module.Chart{
ID: "iis_website_%s_ftp_file_transfer_rate",
Title: "Website FTP file transfer rate",
Units: "files/s",
Fam: "iis",
Ctx: "wmi.iis_website_ftp_file_transfer_rate",
Priority: prioIISWebsiteFTPFileTransferRate,
Dims: module.Dims{
{ID: "iis_website_%s_files_received_total", Name: "received", Algo: module.Incremental},
{ID: "iis_website_%s_files_sent_total", Name: "sent", Algo: module.Incremental},
},
}
iisWebsiteLogonAttemptsRateChartTmpl = module.Chart{
ID: "iis_website_%s_logon_attempts_rate",
Title: "Website logon attempts",
Units: "attempts/s",
Fam: "iis",
Ctx: "wmi.iis_website_logon_attempts_rate",
Priority: prioIISWebsiteLogonAttemptsRate,
Dims: module.Dims{
{ID: "iis_website_%s_logon_attempts_total", Name: "logon", Algo: module.Incremental},
},
}
iisWebsiteErrorsRateChart = module.Chart{
ID: "iis_website_%s_errors_rate",
Title: "Website errors",
Units: "errors/s",
Fam: "iis",
Ctx: "wmi.iis_website_errors_rate",
Type: module.Stacked,
Priority: prioIISWebsiteErrorsRate,
Dims: module.Dims{
{ID: "iis_website_%s_locked_errors_total", Name: "document_locked", Algo: module.Incremental},
{ID: "iis_website_%s_not_found_errors_total", Name: "document_not_found", Algo: module.Incremental},
},
}
iisWebsiteUptimeChartTmpl = module.Chart{
ID: "iis_website_%s_uptime",
Title: "Website uptime",
Units: "seconds",
Fam: "iis",
Ctx: "wmi.iis_website_uptime",
Priority: prioIISWebsiteUptime,
Dims: module.Dims{
{ID: "iis_website_%s_service_uptime", Name: "uptime"},
},
}
)

// Logon
var (
logonCharts = module.Charts{
Expand Down Expand Up @@ -971,6 +1128,34 @@ func (w *WMI) removeThermalZoneCharts(zone string) {
}
}

func (w *WMI) addIISWebsiteCharts(website string) {
charts := iisWebsiteChartsTmpl.Copy()

for _, chart := range *charts {
chart.ID = fmt.Sprintf(chart.ID, website)
chart.Labels = []module.Label{
{Key: "website", Value: website},
}
for _, dim := range chart.Dims {
dim.ID = fmt.Sprintf(dim.ID, website)
}
}

if err := w.Charts().Add(*charts...); err != nil {
w.Warning(err)
}
}

func (w *WMI) removeIIWebsiteSCharts(website string) {
px := fmt.Sprintf("iis_website_%s", website)
for _, chart := range *w.Charts() {
if strings.HasPrefix(chart.ID, px) {
chart.MarkRemove()
chart.MarkNotCreated()
}
}
}

func (w *WMI) addProcessesCharts() {
charts := processesCharts.Copy()

Expand Down
4 changes: 4 additions & 0 deletions modules/wmi/collect.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const (
collectorLogon = "logon"
collectorThermalZone = "thermalzone"
collectorTCP = "tcp"
collectorIIS = "iis"
collectorProcess = "process"
collectorService = "service"
)
Expand All @@ -41,6 +42,7 @@ var fastCollectors = map[string]bool{
// slow collectors with gauge (absolute) metrics only
var slowCollectors = map[string]bool{
collectorLogon: true,
collectorIIS: true,
collectorThermalZone: true,
collectorService: true,
}
Expand Down Expand Up @@ -155,6 +157,8 @@ func (w *WMI) collectMetrics(mx map[string]int64, prom prometheus.Prometheus) er
w.collectProcess(mx, pms)
case collectorService:
w.collectService(mx, pms)
case collectorIIS:
w.collectIIS(mx, pms)
}
}

Expand Down
140 changes: 140 additions & 0 deletions modules/wmi/collect_iis.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
// SPDX-License-Identifier: GPL-3.0-or-later

package wmi

import (
"strings"

"github.com/netdata/go.d.plugin/pkg/prometheus"
)

const (
metricIISCurrentAnonymousUsers = "windows_iis_current_anonymous_users"
metricIISCurrentNonAnonymousUsers = "windows_iis_current_non_anonymous_users"
metricIISCurrentConnections = "windows_iis_current_connections"
metricIICurrentISAPIExtRequests = "windows_iis_current_isapi_extension_requests"
metricIISUptime = "windows_iis_service_uptime"

metricIISReceivedBytesTotal = "windows_iis_received_bytes_total"
metricIISSentBytesTotal = "windows_iis_sent_bytes_total"
metricIISRequestsTotal = "windows_iis_requests_total"
metricIISIPAPIExtRequestsTotal = "windows_iis_ipapi_extension_requests_total"
metricIISConnAttemptsAllInstancesTotal = "windows_iis_connection_attempts_all_instances_total"
metricIISFilesReceivedTotal = "windows_iis_files_received_total"
metricIISFilesSentTotal = "windows_iis_files_sent_total"
metricIISLogonAttemptsTotal = "windows_iis_logon_attempts_total"
metricIISLockedErrorsTotal = "windows_iis_locked_errors_total"
metricIISNotFoundErrorsTotal = "windows_iis_not_found_errors_total"
)

func (w *WMI) collectIIS(mx map[string]int64, pms prometheus.Metrics) {
seen := make(map[string]bool)
px := "iis_website_"
for _, pm := range pms.FindByName(metricIISCurrentAnonymousUsers) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_current_anonymous_users"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISCurrentNonAnonymousUsers) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_current_non_anonymous_users"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISCurrentConnections) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_current_connections"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIICurrentISAPIExtRequests) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_current_isapi_extension_requests"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISUptime) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_service_uptime"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISReceivedBytesTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_received_bytes_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISSentBytesTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_sent_bytes_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISRequestsTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_requests_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISConnAttemptsAllInstancesTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_connection_attempts_all_instances_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISFilesReceivedTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_files_received_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISFilesSentTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_files_sent_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISIPAPIExtRequestsTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_isapi_extension_requests_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISLogonAttemptsTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_logon_attempts_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISLockedErrorsTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_locked_errors_total"] += int64(pm.Value)
}
}
for _, pm := range pms.FindByName(metricIISNotFoundErrorsTotal) {
if name := cleanWebsiteName(pm.Labels.Get("site")); name != "" {
seen[name] = true
mx[px+name+"_not_found_errors_total"] += int64(pm.Value)
}
}

for site := range seen {
if !w.cache.iis[site] {
w.cache.iis[site] = true
w.addIISWebsiteCharts(site)
}
}
for site := range w.cache.iis {
if !seen[site] {
delete(w.cache.iis, site)
w.removeIIWebsiteSCharts(site)
}
}
}

func cleanWebsiteName(name string) string {
return strings.ReplaceAll(name, " ", "_")
}
Loading