Skip to content

Commit a9bc092

Browse files
committed
roachprod: add parca-agent start and stop
Adds the ability to install the Parca Agent. For more details on the capabilities of Parca and Polaris Signals see [1] & [2]. [1]: https://github.com/parca-dev/parca [2]: https://www.polarsignals.com/docs/overview Epic: None Release note: None
1 parent 8c6cbd3 commit a9bc092

File tree

6 files changed

+126
-0
lines changed

6 files changed

+126
-0
lines changed

pkg/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,6 +1709,7 @@ GO_TARGETS = [
17091709
"//pkg/roachprod/agents/fluentbit:fluentbit",
17101710
"//pkg/roachprod/agents/opentelemetry:opentelemetry",
17111711
"//pkg/roachprod/agents/opentelemetry:opentelemetry_test",
1712+
"//pkg/roachprod/agents/parca:parca",
17121713
"//pkg/roachprod/blobfixture:blobfixture",
17131714
"//pkg/roachprod/blobfixture:blobfixture_test",
17141715
"//pkg/roachprod/cloud:cloud",

pkg/roachprod/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ go_library(
1818
"//pkg/cmd/roachprod/grafana",
1919
"//pkg/roachprod/agents/fluentbit",
2020
"//pkg/roachprod/agents/opentelemetry",
21+
"//pkg/roachprod/agents/parca",
2122
"//pkg/roachprod/cloud",
2223
"//pkg/roachprod/config",
2324
"//pkg/roachprod/install",
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library")
2+
3+
go_library(
4+
name = "parca",
5+
srcs = ["parca.go"],
6+
embedsrcs = ["files/parca-agent.service"],
7+
importpath = "github.com/cockroachdb/cockroach/pkg/roachprod/agents/parca",
8+
visibility = ["//visibility:public"],
9+
deps = [
10+
"//pkg/roachprod/install",
11+
"//pkg/roachprod/logger",
12+
"@com_github_cockroachdb_errors//:errors",
13+
],
14+
)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[Unit]
2+
Description=Parca Agent
3+
Documentation=https://www.parca.dev/docs/systemd
4+
Requires=network.target
5+
After=network.target
6+
7+
[Service]
8+
Type=simple
9+
User=root
10+
Group=root
11+
12+
ExecStart=/opt/parca/parca-agent --remote-store-bearer-token-file=/opt/parca/parca.token --remote-store-address=grpc.polarsignals.com:443 --http-address=:7071
13+
14+
Restart=on-failure
15+
RestartSec=10
16+
17+
StandardOutput=syslog
18+
StandardError=syslog
19+
SyslogIdentifier=parcaagent
20+
21+
[Install]
22+
WantedBy=multi-user.target
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright 2025 The Cockroach Authors.
2+
//
3+
// Use of this software is governed by the CockroachDB Software License
4+
// included in the /LICENSE file.
5+
6+
package parca
7+
8+
import (
9+
"context"
10+
_ "embed"
11+
12+
"github.com/cockroachdb/cockroach/pkg/roachprod/install"
13+
"github.com/cockroachdb/cockroach/pkg/roachprod/logger"
14+
"github.com/cockroachdb/errors"
15+
)
16+
17+
//go:embed files/parca-agent.service
18+
var parcaAgentSystemdUnit string
19+
20+
type Config struct {
21+
Token string
22+
}
23+
24+
// Install installs the Parca Agent on the cluster and starts it as a systemd service.
25+
func Install(ctx context.Context, l *logger.Logger, c *install.SyncedCluster, config Config) error {
26+
27+
if err := c.PutString(ctx, l, c.Nodes, config.Token, "/tmp/parca.token", 0644); err != nil {
28+
return errors.Wrapf(err, "failed writing token")
29+
}
30+
if err := c.PutString(ctx, l, c.Nodes, parcaAgentSystemdUnit, "/tmp/parca-agent.service", 0644); err != nil {
31+
return errors.Wrapf(err, "failed writing parca agent systemd unit file")
32+
}
33+
34+
if err := c.Run(ctx, l, l.Stdout, l.Stderr, install.WithNodes(c.Nodes),
35+
"download and set up parca-agent", `sudo mkdir -p /opt/parca
36+
curl -sL https://github.com/parca-dev/parca-agent/releases/download/v0.42.0/parca-agent_0.42.0_$(uname -s)_$(uname -m) -o /tmp/parca-agent
37+
sudo mv /tmp/parca-agent /opt/parca/parca-agent && chmod +x /opt/parca/parca-agent
38+
sudo mv /tmp/parca.token /opt/parca/parca.token
39+
sudo mv /tmp/parca-agent.service /etc/systemd/system/parca-agent.service
40+
sudo systemctl daemon-reload && sudo systemctl enable parca-agent && sudo systemctl restart parca-agent
41+
`); err != nil {
42+
return err
43+
}
44+
45+
return nil
46+
}
47+
48+
// Stop stops the Parca Agent on the cluster and removes it from systemd.
49+
func Stop(ctx context.Context, l *logger.Logger, c *install.SyncedCluster) error {
50+
return c.Run(ctx, l, l.Stdout, l.Stderr,
51+
install.WithNodes(c.Nodes).WithShouldRetryFn(install.AlwaysTrue), "parca-agent-stop",
52+
"sudo systemctl disable parca-agent && sudo systemctl stop parca-agent")
53+
}

pkg/roachprod/roachprod.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"github.com/cockroachdb/cockroach/pkg/cmd/roachprod/grafana"
3434
"github.com/cockroachdb/cockroach/pkg/roachprod/agents/fluentbit"
3535
"github.com/cockroachdb/cockroach/pkg/roachprod/agents/opentelemetry"
36+
"github.com/cockroachdb/cockroach/pkg/roachprod/agents/parca"
3637
"github.com/cockroachdb/cockroach/pkg/roachprod/cloud"
3738
"github.com/cockroachdb/cockroach/pkg/roachprod/config"
3839
"github.com/cockroachdb/cockroach/pkg/roachprod/install"
@@ -2596,6 +2597,40 @@ func StopOpenTelemetry(ctx context.Context, l *logger.Logger, clusterName string
25962597
return opentelemetry.Stop(ctx, l, c)
25972598
}
25982599

2600+
// StartParcaAgent starts a Parca Agent on the cluster.
2601+
func StartParcaAgent(
2602+
ctx context.Context, l *logger.Logger, clusterName string, config parca.Config,
2603+
) error {
2604+
if config.Token == "" {
2605+
return errors.New("Token cannot be empty")
2606+
}
2607+
2608+
if err := LoadClusters(); err != nil {
2609+
return err
2610+
}
2611+
2612+
c, err := newCluster(l, clusterName)
2613+
if err != nil {
2614+
return err
2615+
}
2616+
2617+
return parca.Install(ctx, l, c, config)
2618+
}
2619+
2620+
// StopParcaAgent stops the Parca Agent on the cluster.
2621+
func StopParcaAgent(ctx context.Context, l *logger.Logger, clusterName string) error {
2622+
if err := LoadClusters(); err != nil {
2623+
return err
2624+
}
2625+
2626+
c, err := newCluster(l, clusterName)
2627+
if err != nil {
2628+
return err
2629+
}
2630+
2631+
return parca.Stop(ctx, l, c)
2632+
}
2633+
25992634
// DestroyDNS destroys the DNS records for the given cluster.
26002635
func DestroyDNS(ctx context.Context, l *logger.Logger, clusterName string) error {
26012636
c, err := GetClusterFromCache(l, clusterName)

0 commit comments

Comments
 (0)