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

Commit

Permalink
IIS Metrics (#972)
Browse files Browse the repository at this point in the history
Co-authored-by: ilyam8 <ilya@netdata.cloud>
  • Loading branch information
thiagoftsm and ilyam8 authored Nov 8, 2022
1 parent 3e1a0a7 commit a3babe9
Show file tree
Hide file tree
Showing 7 changed files with 930 additions and 226 deletions.
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

0 comments on commit a3babe9

Please sign in to comment.