Skip to content

Commit 29b9c46

Browse files
authored
chore(deps): Upgrade windows exporter to v0.29.2 (#215)
1 parent fd88b22 commit 29b9c46

File tree

6 files changed

+105
-25
lines changed

6 files changed

+105
-25
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## 1.1.0 (2024-12-17)
9+
### Changed
10+
- Upgraded the exporter version to v0.29.2
11+
812
## 1.0.3 (2024-09-10)
913
### Fixed
1014
- Bumped dependencies

src/exporter/exporter.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ func New(verbose bool, bindAddress string, bindPort string) (*Exporter, error) {
5858
exporterPath,
5959
"--collectors.enabled", enabledCollectors,
6060
"--log.level", exporterLogLevel,
61-
"--log.format", "logger:stderr?json=true",
62-
"--collector.service.use-api", // enable collection using windows API instead of WMI
63-
"--collector.service.services-where", "Name like '%'", // All Added to avoid warn message from Exporter
64-
"--telemetry.addr", exporterURL)
61+
"--log.format", "json",
62+
// "--collector.service.use-api", // The WMI based collector is gone used to enable collection using windows API instead of WMI
63+
"--collector.service.include", ".*", // All Added to avoid warn message from Exporter
64+
"--web.listen-address", exporterURL,
65+
)
6566

6667
return &Exporter{
6768
URL: exporterURL,

src/nri/metricsProcesor.go

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package nri
77

88
import (
99
"fmt"
10+
"strings"
1011
"time"
1112

1213
"github.com/newrelic/nri-winservices/src/matcher"
@@ -43,14 +44,28 @@ func ProcessMetrics(i *integration.Integration, metricFamilyMap scraper.MetricFa
4344

4445
for _, metricsRules := range entityRules.Metrics {
4546
if metricFamily, ok := metricFamilyMap[metricsRules.ProviderName]; ok {
46-
if err := processMetricGauge(metricFamily, entityRules, entityMap, hostname); err != nil {
47+
if err := processMetricGauge(metricFamily, entityRules, entityMap, metricFamilyMap, hostname); err != nil {
4748
log.Warn("error processing metric:%v", err.Error())
4849
}
4950
}
5051
}
5152
return nil
5253
}
5354

55+
func findProcessId(metricFamily dto.MetricFamily, key string, entityRules EntityRules) (string, error) {
56+
for _, m := range metricFamily.GetMetric() {
57+
serviceName, _ := getLabelValue(m.GetLabel(), entityRules.EntityName.Label)
58+
if serviceName == key {
59+
for _, l := range m.GetLabel() {
60+
if l.GetName() == "process_id" {
61+
return l.GetValue(), nil
62+
}
63+
}
64+
}
65+
}
66+
return "", fmt.Errorf("label %v not found", key)
67+
}
68+
5469
func createEntities(integrationInstance *integration.Integration, metricFamilyMap scraper.MetricFamiliesByName, entityRules EntityRules, matcher matcher.Matcher) (entitiesByName, error) {
5570
entityMap := make(map[string]*integration.Entity)
5671

@@ -80,7 +95,7 @@ func createEntities(integrationInstance *integration.Integration, metricFamilyMa
8095
continue
8196
}
8297

83-
entityName := fmt.Sprintf("%s:%s:%s", entityNamePrefix, hostName, serviceName)
98+
entityName := fmt.Sprintf("%s:%s:%s", entityNamePrefix, hostName, strings.ToLower(serviceName))
8499

85100
entity, err := integrationInstance.NewEntity(entityName, entityRules.EntityType, serviceDisplayName)
86101
if err != nil {
@@ -95,7 +110,7 @@ func createEntities(integrationInstance *integration.Integration, metricFamilyMa
95110
return entityMap, nil
96111
}
97112

98-
func processMetricGauge(metricFamily dto.MetricFamily, entityRules EntityRules, ebn entitiesByName, hostname string) error {
113+
func processMetricGauge(metricFamily dto.MetricFamily, entityRules EntityRules, ebn entitiesByName, metricFamilyMap scraper.MetricFamiliesByName, hostname string) error {
99114
metricRules, err := entityRules.getMetricRules(metricFamily.GetName())
100115
if err != nil {
101116
return fmt.Errorf("metric rule not found")
@@ -121,6 +136,19 @@ func processMetricGauge(metricFamily dto.MetricFamily, entityRules EntityRules,
121136
}
122137

123138
attributes, metadata := getAttributesAndMetadata(entityRules, metricRules.Attributes, m, hostname)
139+
// Add process_id to windows_service_info metrics Family
140+
if metricFamily.GetName() == "windows_service_info" {
141+
winServiceProcess, ok := metricFamilyMap["windows_service_process"]
142+
if ok {
143+
processId, err := findProcessId(winServiceProcess, serviceName, entityRules)
144+
if err != nil {
145+
metadata["process_id"] = "0"
146+
} else {
147+
metadata["process_id"] = processId
148+
149+
}
150+
}
151+
}
124152
addMetadata(metadata, e)
125153
// _info metrics only contains metadata
126154
if metricRules.InfoMetric {
@@ -143,6 +171,11 @@ func processMetricGauge(metricFamily dto.MetricFamily, entityRules EntityRules,
143171
func addMetadata(metadata metadataMap, e *integration.Entity) {
144172
var err error
145173
for k, v := range metadata {
174+
// latest version exporter sends service_name in camel case
175+
// for consistency we need to convert it to lowercase
176+
if k == "service_name" {
177+
v = strings.ToLower(v)
178+
}
146179
err = e.AddMetadata(k, v)
147180
warnOnErr(err)
148181
}

src/nri/metricsProcesor_test.go

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package nri
77

88
import (
9+
"strings"
910
"testing"
1011

1112
"github.com/newrelic/infra-integrations-sdk/v4/integration"
@@ -17,7 +18,7 @@ import (
1718
)
1819

1920
const (
20-
serviceName = "rpcss"
21+
serviceName = "RpcSs"
2122
serviceStartMode = "auto"
2223
serviceDisplayName = "Remote Procedure Call (RPC)"
2324
servicePid = "668"
@@ -89,6 +90,28 @@ var metricFamlilyService = dto.MetricFamily{
8990
},
9091
}
9192

93+
var metricFamlilyServiceProcess = dto.MetricFamily{
94+
Name: strPtr("windows_service_process"),
95+
Type: &gauge,
96+
Metric: []*dto.Metric{
97+
{
98+
Label: []*dto.LabelPair{
99+
{
100+
Name: strPtr("name"),
101+
Value: strPtr(serviceName),
102+
},
103+
{
104+
Name: strPtr("process_id"),
105+
Value: strPtr(servicePid),
106+
},
107+
},
108+
Gauge: &dto.Gauge{
109+
Value: float64Ptr(1),
110+
},
111+
},
112+
},
113+
}
114+
92115
func TestCreateEntities(t *testing.T) {
93116
i, _ := integration.New("integrationName", "integrationVersion")
94117
rules := loadRules()
@@ -103,7 +126,7 @@ func TestCreateEntities(t *testing.T) {
103126
_, ok := entityMap[serviceName]
104127
require.True(t, ok)
105128
require.Len(t, i.Entities, 1)
106-
require.Equal(t, i.Entities[0].Name(), entityNamePrefix+":"+hostName+":"+serviceName)
129+
require.Equal(t, i.Entities[0].Name(), entityNamePrefix+":"+hostName+":"+strings.ToLower(serviceName))
107130
require.False(t, i.Entities[0].IgnoreEntity)
108131
}
109132

@@ -119,8 +142,8 @@ func TestNoServiceNameAllowed(t *testing.T) {
119142
entityMap, err := createEntities(i, mfbn, rules, matcher)
120143
require.NoError(t, err, "No error is expected even if no service is allowed")
121144
require.Len(t, entityMap, 0, "No entity is expected since no service is allowed")
122-
err = processMetricGauge(metricFamlilyService, rules, entityMap, hostname)
123-
err = processMetricGauge(metricFamlilyService, rules, entityMap, hostname)
145+
err = processMetricGauge(metricFamlilyService, rules, entityMap, mfbn, hostname)
146+
err = processMetricGauge(metricFamlilyService, rules, entityMap, mfbn, hostname)
124147
require.NoError(t, err)
125148
require.NoError(t, err, "No error is expected even if entityMap is empty")
126149
}
@@ -131,22 +154,31 @@ func TestProccessMetricGauge(t *testing.T) {
131154
mfbn := scraper.MetricFamiliesByName{
132155
"windows_service_info": metricFamlilyServiceInfo,
133156
"windows_service_start_mode": metricFamlilyService,
157+
"windows_service_process": metricFamlilyServiceProcess,
134158
}
135159

136160
matcher := matcher.New(filter)
137161
entityMap, err := createEntities(i, mfbn, rules, matcher)
138162
require.NoError(t, err)
139163
// process info metrics
140-
err = processMetricGauge(metricFamlilyServiceInfo, rules, entityMap, hostname)
164+
err = processMetricGauge(metricFamlilyServiceInfo, rules, entityMap, mfbn, hostname)
141165
require.NoError(t, err)
142166
metadata := entityMap[serviceName].GetMetadata()
143167
assert.Equal(t, serviceDisplayName, metadata["display_name"])
144-
assert.Equal(t, servicePid, metadata["process_id"])
168+
169+
// Service name in lowercase check
170+
assert.Equal(t, strings.ToLower(serviceName), metadata["service_name"])
171+
145172
// process startmode metrics
146-
err = processMetricGauge(metricFamlilyService, rules, entityMap, hostname)
173+
err = processMetricGauge(metricFamlilyService, rules, entityMap, mfbn, hostname)
147174
assert.NoError(t, err)
148175
assert.Equal(t, serviceStartMode, metadata["start_mode"])
149176

177+
// process start process metrics
178+
err = processMetricGauge(metricFamlilyServiceProcess, rules, entityMap, mfbn, hostname)
179+
assert.NoError(t, err)
180+
assert.Equal(t, servicePid, metadata["process_id"])
181+
150182
}
151183

152184
func strPtr(s string) *string {

src/nri/rules.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,6 @@ func loadRules() EntityRules {
8383
NrdbLabelName: "display_name",
8484
IsEntityMetadata: true,
8585
},
86-
{
87-
Label: "process_id",
88-
NrdbLabelName: "process_id",
89-
IsEntityMetadata: true,
90-
},
9186
},
9287
},
9388
{
@@ -115,6 +110,24 @@ func loadRules() EntityRules {
115110
},
116111
},
117112
},
113+
{
114+
ProviderName: "windows_service_process",
115+
MetricType: "gauge",
116+
NrdbName: "windows_service_process",
117+
EnumMetric: true,
118+
Attributes: []Attribute{
119+
{
120+
Label: "name",
121+
NrdbLabelName: "service_name",
122+
IsEntityMetadata: true,
123+
},
124+
{
125+
Label: "process_id",
126+
NrdbLabelName: "process_id",
127+
IsEntityMetadata: true,
128+
},
129+
},
130+
},
118131
},
119132
}
120133

win_build.ps1

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ $commitHash = (git rev-parse HEAD)
2121

2222
$exporterRepo = "github.com/prometheus-community/windows_exporter"
2323
$exporterBinaryName = "windows_exporter.exe"
24-
# Commit used by v0.16.0 of windows_exporter
25-
$exporterVersion = "1c199e6c0eed881fb09dfcc84eee191262215e5e"
26-
# Collector used by the Windows Service integration
27-
$collectors = "collector.go","wmi.go","perflib.go","service.go","cs.go"
24+
# Commit used by v0.29.2 of windows_exporter
25+
$exporterVersion = "622813343f930c121c8b1c061d6dd6f02d96015f"
26+
2827

2928
$env:GOPATH = go env GOPATH
3029
$env:GOBIN = "$env:GOPATH\bin"
@@ -111,8 +110,6 @@ if (-Not $skipExporterCompile)
111110
exit -1
112111
}
113112

114-
# remove unused collectors
115-
Remove-Item .\collector\* -Exclude $collectors
116113
$ErrorActionPreference = "SilentlyContinue"
117114
go mod download
118115
$ErrorActionPreference = "Stop"

0 commit comments

Comments
 (0)