Skip to content

Commit 9c256cd

Browse files
committed
Replace systemd discoverer
1 parent 2e431f3 commit 9c256cd

File tree

4 files changed

+30
-126
lines changed

4 files changed

+30
-126
lines changed

cmd/parca-agent/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ func run(logger log.Logger, reg *prometheus.Registry, flags flags) error {
364364
flags.Node,
365365
flags.MetadataContainerRuntimeSocketPath,
366366
),
367-
discovery.NewSystemd2Config(),
367+
discovery.NewSystemdConfig(),
368368
}
369369
discoveryManager = discovery.NewManager(logger, reg)
370370
if err := discoveryManager.ApplyConfig(ctx, map[string]discovery.Configs{"all": configs}); err != nil {

go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ require (
99
github.com/cespare/xxhash/v2 v2.2.0
1010
github.com/cilium/ebpf v0.10.0
1111
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be
12-
github.com/coreos/go-systemd/v22 v22.5.0
1312
github.com/docker/docker v20.10.23+incompatible
1413
github.com/dustin/go-humanize v1.0.1
1514
github.com/fsnotify/fsnotify v1.6.0
@@ -22,7 +21,7 @@ require (
2221
github.com/hashicorp/go-version v1.6.0
2322
github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c
2423
github.com/klauspost/compress v1.16.0
25-
github.com/marselester/systemd v0.0.0-20230310181427-d65a642104a7
24+
github.com/marselester/systemd v0.0.1
2625
github.com/minio/highwayhash v1.0.2
2726
github.com/oklog/run v1.1.0
2827
github.com/opencontainers/runtime-spec v1.1.0-rc.1.0.20230201033851-7301c345492a
@@ -87,7 +86,6 @@ require (
8786
github.com/go-openapi/jsonreference v0.20.0 // indirect
8887
github.com/go-openapi/swag v0.22.3 // indirect
8988
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
90-
github.com/godbus/dbus/v5 v5.1.1-0.20221223143132-c1a76c14e486 // indirect
9189
github.com/gofrs/flock v0.8.1 // indirect
9290
github.com/gogo/protobuf v1.3.2 // indirect
9391
github.com/golang-jwt/jwt/v4 v4.4.3 // indirect

go.sum

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,6 @@ github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkE
112112
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
113113
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
114114
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
115-
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
116-
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
117115
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
118116
github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8=
119117
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
@@ -182,9 +180,6 @@ github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRi
182180
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
183181
github.com/goburrow/cache v0.1.4 h1:As4KzO3hgmzPlnaMniZU9+VmoNYseUhuELbxy9mRBfw=
184182
github.com/goburrow/cache v0.1.4/go.mod h1:cDFesZDnIlrHoNlMYqqMpCRawuXulgx+y7mXU8HZ+/c=
185-
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
186-
github.com/godbus/dbus/v5 v5.1.1-0.20221223143132-c1a76c14e486 h1:Ong/oLaBsq0b+/tjpflWZMqhjs7zQpYv4qqRZz7WsRM=
187-
github.com/godbus/dbus/v5 v5.1.1-0.20221223143132-c1a76c14e486/go.mod h1:fXoNnqaUvdKqjJmMGeiBgmRphUg+kO0MT4AhPOP6+Qg=
188183
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
189184
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
190185
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -341,8 +336,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN
341336
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
342337
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
343338
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
344-
github.com/marselester/systemd v0.0.0-20230310181427-d65a642104a7 h1:ip7D1DMNahWLbIri9hW8jvsnGudG6tWyMOs5vMQwgRU=
345-
github.com/marselester/systemd v0.0.0-20230310181427-d65a642104a7/go.mod h1:GqNcIL3xE2CpD82h1IEMirLWMRLm6KXHLRCsJg1SpxQ=
339+
github.com/marselester/systemd v0.0.1 h1:EjSe/B55E3y9kz/x6XIBBsb99BDgq8OP3qsuY8YQSVo=
340+
github.com/marselester/systemd v0.0.1/go.mod h1:GqNcIL3xE2CpD82h1IEMirLWMRLm6KXHLRCsJg1SpxQ=
346341
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
347342
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
348343
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
@@ -628,7 +623,6 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc
628623
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
629624
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
630625
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
631-
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
632626
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
633627
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
634628
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

pkg/discovery/systemd.go

Lines changed: 26 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -16,123 +16,37 @@ package discovery
1616
import (
1717
"context"
1818
"fmt"
19-
"strings"
2019
"time"
2120

22-
systemd "github.com/coreos/go-systemd/v22/dbus"
2321
"github.com/go-kit/log"
2422
"github.com/go-kit/log/level"
25-
systemd2 "github.com/marselester/systemd"
23+
systemd "github.com/marselester/systemd"
2624
"github.com/prometheus/common/model"
2725
)
2826

2927
type SystemdConfig struct{}
3028

31-
type SystemdDiscoverer struct {
32-
logger log.Logger
29+
func NewSystemdConfig() *SystemdConfig {
30+
return &SystemdConfig{}
3331
}
3432

3533
func (c *SystemdConfig) Name() string {
3634
return "systemd"
3735
}
3836

39-
func NewSystemdConfig() *SystemdConfig {
40-
return &SystemdConfig{}
41-
}
42-
4337
func (c *SystemdConfig) NewDiscoverer(d DiscovererOptions) (Discoverer, error) {
4438
return &SystemdDiscoverer{
4539
logger: d.Logger,
4640
}, nil
4741
}
4842

49-
func (c *SystemdDiscoverer) Run(ctx context.Context, up chan<- []*Group) error {
50-
conn, err := systemd.NewWithContext(ctx)
51-
if err != nil {
52-
return fmt.Errorf("failed to connect to systemd D-Bus API, %w", err)
53-
}
54-
defer conn.Close()
55-
56-
isSubStateChanged := func(u1, u2 *systemd.UnitStatus) bool {
57-
return u1.SubState != u2.SubState
58-
}
59-
60-
isNotService := func(name string) bool {
61-
return !strings.HasSuffix(name, ".service")
62-
}
63-
64-
updateCh, errCh := conn.SubscribeUnitsCustom(5*time.Second, 0, isSubStateChanged, isNotService)
65-
66-
for {
67-
select {
68-
case update := <-updateCh:
69-
var groups []*Group
70-
71-
for unit, status := range update {
72-
if status == nil || status.SubState != "running" {
73-
groups = append(groups, &Group{Source: unit})
74-
continue
75-
}
76-
77-
mainPIDProperty, err := conn.GetServicePropertyContext(ctx, unit, "MainPID")
78-
if err != nil {
79-
level.Warn(c.logger).Log("msg", "failed to get MainPID property for service", "err", err, "unit", unit)
80-
continue
81-
}
82-
83-
pid, ok := mainPIDProperty.Value.Value().(uint32)
84-
if !ok {
85-
level.Warn(c.logger).Log("msg", "failed to assert type of PID", "unit", unit)
86-
continue
87-
}
88-
89-
groups = append(groups, &Group{
90-
Targets: []model.LabelSet{{}},
91-
Labels: model.LabelSet{
92-
model.LabelName("systemd_unit"): model.LabelValue(unit),
93-
},
94-
Source: unit,
95-
EntryPID: int(pid),
96-
})
97-
}
98-
99-
select {
100-
case <-ctx.Done():
101-
return ctx.Err()
102-
case up <- groups:
103-
}
104-
case err := <-errCh:
105-
level.Warn(c.logger).Log("msg", "received error from systemd D-Bus API", "err", err)
106-
case <-ctx.Done():
107-
return ctx.Err()
108-
}
109-
}
110-
}
111-
112-
type Systemd2Config struct{}
113-
114-
func NewSystemd2Config() *Systemd2Config {
115-
return &Systemd2Config{}
116-
}
117-
118-
func (c *Systemd2Config) Name() string {
119-
return "systemd2"
120-
}
121-
122-
func (c *Systemd2Config) NewDiscoverer(d DiscovererOptions) (Discoverer, error) {
123-
return &Systemd2Discoverer{
124-
logger: d.Logger,
125-
prev: make(map[string]systemd2.Unit),
126-
}, nil
127-
}
128-
129-
type Systemd2Discoverer struct {
43+
type SystemdDiscoverer struct {
13044
logger log.Logger
131-
prev map[string]systemd2.Unit
45+
units map[string]systemd.Unit
13246
}
13347

134-
func (d *Systemd2Discoverer) Run(ctx context.Context, up chan<- []*Group) error {
135-
c, err := systemd2.New()
48+
func (d *SystemdDiscoverer) Run(ctx context.Context, up chan<- []*Group) error {
49+
c, err := systemd.New()
13650
if err != nil {
13751
return fmt.Errorf("failed to connect to systemd D-Bus API, %w", err)
13852
}
@@ -145,7 +59,7 @@ func (d *Systemd2Discoverer) Run(ctx context.Context, up chan<- []*Group) error
14559
for {
14660
select {
14761
case <-time.After(5 * time.Second):
148-
update, err := d.updatedUnits(c)
62+
update, err := d.unitsUpdate(c)
14963
if err != nil {
15064
level.Warn(d.logger).Log("msg", "failed to get units from systemd D-Bus API", "err", err)
15165
continue
@@ -189,44 +103,42 @@ func (d *Systemd2Discoverer) Run(ctx context.Context, up chan<- []*Group) error
189103
}
190104
}
191105

192-
// updatedUnits is like SubscribeUnitsCustom
193-
// from github.com/coreos/go-systemd/v22/dbus,
194-
// i.e., it returns systemd units if there were any changes detected.
195-
func (d *Systemd2Discoverer) updatedUnits(c *systemd2.Client) (map[string]systemd2.Unit, error) {
196-
cur := make(map[string]systemd2.Unit)
197-
err := c.ListUnits(systemd2.IsService, func(u *systemd2.Unit) {
106+
// unitsUpdate returns systemd units if there were any changes detected.
107+
func (d *SystemdDiscoverer) unitsUpdate(c *systemd.Client) (map[string]systemd.Unit, error) {
108+
recent := make(map[string]systemd.Unit)
109+
err := c.ListUnits(systemd.IsService, func(u *systemd.Unit) {
198110
// Must copy a unit,
199111
// otherwise it will be modified on the next function call.
200-
cur[u.Name] = *u
112+
recent[u.Name] = *u
201113
})
202114
if err != nil {
203115
return nil, err
204116
}
205117

206-
// Collect all new and changed units.
207-
changed := make(map[string]systemd2.Unit)
208-
for name, unit := range cur {
209-
prevUnit, ok := d.prev[name]
118+
// Collect new and changed units.
119+
update := make(map[string]systemd.Unit)
120+
for unitName, unit := range recent {
121+
seenUnit, ok := d.units[unitName]
210122
// Is it a new unit or
211123
// the existing one but with an updated substate?
212-
if !ok || prevUnit.SubState != unit.SubState {
213-
changed[name] = unit
124+
if !ok || seenUnit.SubState != unit.SubState {
125+
update[unitName] = unit
214126
}
215127

216-
delete(d.prev, name)
128+
delete(d.units, unitName)
217129
}
218130

219-
// Add all deleted units.
220-
for name := range d.prev {
221-
changed[name] = systemd2.Unit{}
131+
// Indicate that units were deleted.
132+
for unitName := range d.units {
133+
update[unitName] = systemd.Unit{}
222134
}
223135

224-
d.prev = cur
136+
d.units = recent
225137

226138
// No changes.
227-
if len(changed) == 0 {
139+
if len(update) == 0 {
228140
return nil, nil //nolint:nilnil
229141
}
230142

231-
return changed, nil
143+
return update, nil
232144
}

0 commit comments

Comments
 (0)