-
Notifications
You must be signed in to change notification settings - Fork 706
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
209 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# license collector | ||
|
||
The license collector exposes metrics about the Windows license status. | ||
|
||
||| | ||
-|- | ||
Metric name prefix | `license` | ||
Data source | Win32 | ||
Enabled by default? | No | ||
|
||
## Flags | ||
|
||
None | ||
|
||
## Metrics | ||
|
||
| Name | Description | Type | Labels | | ||
|--------------------------|----------------|-------|---------| | ||
| `windows_license_status` | license status | gauge | `state` | | ||
|
||
### Example metric | ||
|
||
``` | ||
# HELP windows_license_status Status of windows license | ||
# TYPE windows_license_status gauge | ||
windows_license_status{state="genuine"} 1 | ||
windows_license_status{state="invalid_license"} 0 | ||
windows_license_status{state="last"} 0 | ||
windows_license_status{state="offline"} 0 | ||
windows_license_status{state="tampered"} 0 | ||
``` | ||
|
||
|
||
## Useful queries | ||
|
||
Show if the license is genuine | ||
|
||
``` | ||
windows_license_status{state="genuine"} | ||
``` | ||
|
||
## Alerting examples | ||
**prometheus.rules** | ||
```yaml | ||
- alert: "WindowsLicense" | ||
expr: 'windows_license_status{state="genuine"} == 0' | ||
for: "10m" | ||
labels: | ||
severity: "high" | ||
annotations: | ||
summary: "Windows system license is not genuine" | ||
description: "The Windows system license is not genuine. Please check the license status." | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
//go:build windows | ||
|
||
package license | ||
|
||
import ( | ||
"github.com/alecthomas/kingpin/v2" | ||
"github.com/go-kit/log" | ||
"github.com/go-kit/log/level" | ||
"github.com/prometheus/client_golang/prometheus" | ||
|
||
"github.com/prometheus-community/windows_exporter/pkg/headers/slc" | ||
"github.com/prometheus-community/windows_exporter/pkg/types" | ||
) | ||
|
||
const Name = "license" | ||
|
||
var labelMap = map[slc.SL_GENUINE_STATE]string{ | ||
slc.SL_GEN_STATE_IS_GENUINE: "genuine", | ||
slc.SL_GEN_STATE_INVALID_LICENSE: "invalid_license", | ||
slc.SL_GEN_STATE_TAMPERED: "tampered", | ||
slc.SL_GEN_STATE_OFFLINE: "offline", | ||
slc.SL_GEN_STATE_LAST: "last", | ||
} | ||
|
||
type Config struct{} | ||
|
||
var ConfigDefaults = Config{} | ||
|
||
// A collector is a Prometheus collector for WMI Win32_PerfRawData_DNS_DNS metrics | ||
type collector struct { | ||
logger log.Logger | ||
|
||
LicenseStatus *prometheus.Desc | ||
} | ||
|
||
func New(logger log.Logger, _ *Config) types.Collector { | ||
c := &collector{} | ||
c.SetLogger(logger) | ||
return c | ||
} | ||
|
||
func NewWithFlags(_ *kingpin.Application) types.Collector { | ||
return &collector{} | ||
} | ||
|
||
func (c *collector) GetName() string { | ||
return Name | ||
} | ||
|
||
func (c *collector) SetLogger(logger log.Logger) { | ||
c.logger = log.With(logger, "collector", Name) | ||
} | ||
|
||
func (c *collector) GetPerfCounter() ([]string, error) { | ||
return []string{}, nil | ||
} | ||
|
||
func (c *collector) Build() error { | ||
c.LicenseStatus = prometheus.NewDesc( | ||
prometheus.BuildFQName(types.Namespace, Name, "status"), | ||
"Status of windows license", | ||
[]string{"state"}, | ||
nil, | ||
) | ||
|
||
return nil | ||
} | ||
|
||
// Collect sends the metric values for each metric | ||
// to the provided prometheus Metric channel. | ||
func (c *collector) Collect(_ *types.ScrapeContext, ch chan<- prometheus.Metric) error { | ||
if err := c.collect(ch); err != nil { | ||
_ = level.Error(c.logger).Log("msg", "failed collecting license metrics", "err", err) | ||
return err | ||
} | ||
return nil | ||
} | ||
|
||
func (c *collector) collect(ch chan<- prometheus.Metric) error { | ||
status, err := slc.SLIsWindowsGenuineLocal() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
for k, v := range labelMap { | ||
val := 0.0 | ||
if status == k { | ||
val = 1.0 | ||
} | ||
|
||
ch <- prometheus.MustNewConstMetric(c.LicenseStatus, prometheus.GaugeValue, val, v) | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package license_test | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/prometheus-community/windows_exporter/pkg/collector/license" | ||
"github.com/prometheus-community/windows_exporter/pkg/testutils" | ||
) | ||
|
||
func BenchmarkCollector(b *testing.B) { | ||
testutils.FuncBenchmarkCollector(b, license.Name, license.NewWithFlags) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package slc | ||
|
||
import ( | ||
"errors" | ||
"unsafe" | ||
|
||
"golang.org/x/sys/windows" | ||
) | ||
|
||
var ( | ||
slc = windows.NewLazySystemDLL("slc.dll") | ||
procSLIsWindowsGenuineLocal = slc.NewProc("SLIsWindowsGenuineLocal") | ||
) | ||
|
||
// Define SL_GENUINE_STATE enumeration | ||
// https://learn.microsoft.com/en-us/windows/win32/api/slpublic/ne-slpublic-sl_genuine_state | ||
type SL_GENUINE_STATE uint32 | ||
|
||
const ( | ||
SL_GEN_STATE_IS_GENUINE SL_GENUINE_STATE = iota | ||
SL_GEN_STATE_INVALID_LICENSE | ||
SL_GEN_STATE_TAMPERED | ||
SL_GEN_STATE_OFFLINE | ||
SL_GEN_STATE_LAST | ||
) | ||
|
||
// SLIsWindowsGenuineLocal function wrapper | ||
func SLIsWindowsGenuineLocal() (SL_GENUINE_STATE, error) { | ||
var genuineState SL_GENUINE_STATE | ||
|
||
_, _, err := procSLIsWindowsGenuineLocal.Call( | ||
uintptr(unsafe.Pointer(&genuineState)), | ||
) | ||
|
||
if !errors.Is(err, windows.NTE_OP_OK) { | ||
return 0, err | ||
} | ||
|
||
return genuineState, nil | ||
} |