Skip to content

Commit f63e3f5

Browse files
committed
chore: add task
1 parent 019a9b6 commit f63e3f5

File tree

5 files changed

+75
-56
lines changed

5 files changed

+75
-56
lines changed

Taskfile.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,12 @@ tasks:
342342
- task: build
343343
- cmd: go run ./tests/load/main --avalanchego-path=./build/avalanchego {{.CLI_ARGS}}
344344

345+
test-load-devnet:
346+
desc: Runs e2e test for load testing against an external network
347+
cmds:
348+
- task: build
349+
- cmd: go test -run ^TestDevnetConnection ./tests/load --avalanchego-path=../../build/avalanchego
350+
345351
test-load-exclusive:
346352
desc: Runs load tests against kube with exclusive scheduling
347353
cmds:

scripts/build_test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ if [[ -n "${NO_RACE:-}" ]]; then
1919
race=""
2020
fi
2121

22-
EXCLUDED_TARGETS="| grep -v /mocks | grep -v proto | grep -v tests/e2e | grep -v tests/load/c | grep -v tests/upgrade | grep -v tests/fixture/bootstrapmonitor/e2e | grep -v tests/reexecute"
22+
EXCLUDED_TARGETS="| grep -v /mocks | grep -v proto | grep -v tests/e2e | grep -v tests/load | grep -v tests/upgrade | grep -v tests/fixture/bootstrapmonitor/e2e | grep -v tests/reexecute"
2323

2424
if [[ "$(go env GOOS)" == "windows" ]]; then
2525
# Test discovery for the antithesis test setups is broken due to

tests/load/main/main.go

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/ava-labs/libevm/core/types"
1818
"github.com/ava-labs/libevm/crypto"
1919
"github.com/ava-labs/libevm/ethclient"
20+
"github.com/google/uuid"
2021
"github.com/prometheus/client_golang/prometheus"
2122
"github.com/stretchr/testify/require"
2223
"golang.org/x/exp/maps"
@@ -97,19 +98,36 @@ func main() {
9798
require.NoError(metricsServer.Stop())
9899
})
99100

100-
var workers []load.Worker
101+
var (
102+
workers []load.Worker
103+
labels map[string]string
104+
)
105+
101106
if devnetConfigPath != "" {
102107
b, err := os.ReadFile(devnetConfigPath)
103108
require.NoError(err)
104109

105110
var devnetConfig load.DevnetConfig
106111
require.NoError(json.Unmarshal(b, &devnetConfig))
107112

108-
workers = load.ConnectNetwork(tc, metricsServer, devnetConfig)
113+
workers = load.ConnectNetwork(tc, devnetConfig)
114+
115+
networkUUID := uuid.New()
116+
labels = map[string]string{
117+
"job": "load-test",
118+
"is_ephemeral_node": "false",
119+
"chain": "C",
120+
"networkUUID": networkUUID.String(),
121+
}
109122
} else {
110-
workers = startNetwork(tc, metricsServer)
123+
network, wkrs := startNetwork(tc)
124+
125+
workers = wkrs
126+
labels = network.GetMonitoringLabels()
111127
}
112128

129+
startPrometheusMonitoring(tc, labels, metricsServer.Address())
130+
113131
chainID, err := workers[0].Client.ChainID(ctx)
114132
require.NoError(err)
115133

@@ -143,7 +161,7 @@ func main() {
143161
// interact with the network.
144162
//
145163
// Customization of the network and the number of workers can be set via flags.
146-
func startNetwork(tc tests.TestContext, metricsServer *tests.PrometheusServer) []load.Worker {
164+
func startNetwork(tc tests.TestContext) (*tmpnet.Network, []load.Worker) {
147165
require := require.New(tc)
148166

149167
numNodes, err := flagVars.NodeCount()
@@ -169,19 +187,6 @@ func startNetwork(tc tests.TestContext, metricsServer *tests.PrometheusServer) [
169187
wsURIs, err := tmpnet.GetNodeWebsocketURIs(network.Nodes, blockchainID)
170188
require.NoError(err)
171189

172-
monitoringConfigFilePath, err := tmpnet.WritePrometheusSDConfig("load-test", tmpnet.SDConfig{
173-
Targets: []string{metricsServer.Address()},
174-
Labels: network.GetMonitoringLabels(),
175-
}, false)
176-
require.NoError(err, "failed to generate monitoring config file")
177-
178-
tc.DeferCleanup(func() {
179-
require.NoError(
180-
os.Remove(monitoringConfigFilePath),
181-
"failed †o remove monitoring config file",
182-
)
183-
})
184-
185190
workers := make([]load.Worker, len(keys))
186191
for i := range len(keys) {
187192
wsURI := wsURIs[i%len(wsURIs)]
@@ -194,7 +199,27 @@ func startNetwork(tc tests.TestContext, metricsServer *tests.PrometheusServer) [
194199
}
195200
}
196201

197-
return workers
202+
return network, workers
203+
}
204+
205+
// startPrometheusMonitoring enables Prometheus monitoring for any client-side
206+
// metrics and registers a cleanup function to remove the monitoring
207+
// configuration file when the test completes.
208+
func startPrometheusMonitoring(tc tests.TestContext, labels map[string]string, serverAddress string) {
209+
require := require.New(tc)
210+
211+
monitoringConfigFilePath, err := tmpnet.WritePrometheusSDConfig("load-test", tmpnet.SDConfig{
212+
Targets: []string{serverAddress},
213+
Labels: labels,
214+
}, false)
215+
require.NoError(err, "failed to generate monitoring config file")
216+
217+
tc.DeferCleanup(func() {
218+
require.NoError(
219+
os.Remove(monitoringConfigFilePath),
220+
"failed †o remove monitoring config file",
221+
)
222+
})
198223
}
199224

200225
// newTokenContract deploys an instance of an ERC20 token and distributes the

tests/load/network.go

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,10 @@
44
package load
55

66
import (
7-
"os"
8-
97
"github.com/ava-labs/libevm/ethclient"
10-
"github.com/google/uuid"
118
"github.com/stretchr/testify/require"
129

1310
"github.com/ava-labs/avalanchego/tests"
14-
"github.com/ava-labs/avalanchego/tests/fixture/tmpnet"
1511
"github.com/ava-labs/avalanchego/utils/crypto/secp256k1"
1612
)
1713

@@ -28,10 +24,11 @@ type DevnetConfig struct {
2824
func (d DevnetConfig) ParseKeys() ([]*secp256k1.PrivateKey, error) {
2925
keys := make([]*secp256k1.PrivateKey, len(d.PrivateKeys))
3026
for i, pk := range d.PrivateKeys {
31-
key, err := secp256k1.ToPrivateKey([]byte(pk))
32-
if err != nil {
27+
key := new(secp256k1.PrivateKey)
28+
if err := key.UnmarshalText([]byte(pk)); err != nil {
3329
return nil, err
3430
}
31+
3532
keys[i] = key
3633
}
3734

@@ -40,11 +37,7 @@ func (d DevnetConfig) ParseKeys() ([]*secp256k1.PrivateKey, error) {
4037

4138
// ConnectNetwork connects to an existing network and returns a list of workers
4239
// that can interact with the network.
43-
//
44-
// The function also configures Prometheus monitoring for any client-side
45-
// metrics defined in metricsServer and registers a cleanup function to remove the
46-
// monitoring configuration file when the test completes.
47-
func ConnectNetwork(tc tests.TestContext, metricsServer *tests.PrometheusServer, devnetConfig DevnetConfig) []Worker {
40+
func ConnectNetwork(tc tests.TestContext, devnetConfig DevnetConfig) []Worker {
4841
require := require.New(tc)
4942

5043
keys, err := devnetConfig.ParseKeys()
@@ -67,27 +60,5 @@ func ConnectNetwork(tc tests.TestContext, metricsServer *tests.PrometheusServer,
6760
}
6861
}
6962

70-
// XXX: we could probably remove this metrics code from ConnectNetwork
71-
networkUUID := uuid.NewString()
72-
labels := map[string]string{
73-
"job": "load-test",
74-
"is_ephemeral_node": "false",
75-
"chain": "C",
76-
"networkUUID": networkUUID,
77-
}
78-
79-
monitoringConfigFilePath, err := tmpnet.WritePrometheusSDConfig("load-test", tmpnet.SDConfig{
80-
Targets: []string{metricsServer.Address()},
81-
Labels: labels,
82-
}, false)
83-
require.NoError(err, "failed to generate monitoring config file")
84-
85-
tc.DeferCleanup(func() {
86-
require.NoError(
87-
os.Remove(monitoringConfigFilePath),
88-
"failed †o remove monitoring config file",
89-
)
90-
})
91-
9263
return workers
9364
}

tests/load/network_test.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
package load
55

66
import (
7+
"context"
8+
"math/big"
79
"testing"
10+
"time"
811

912
"github.com/onsi/ginkgo/v2"
1013
"github.com/prometheus/client_golang/prometheus"
1114
"github.com/stretchr/testify/require"
1215

13-
"github.com/ava-labs/avalanchego/tests"
1416
"github.com/ava-labs/avalanchego/tests/fixture/e2e"
1517
"github.com/ava-labs/avalanchego/tests/fixture/tmpnet"
1618
)
@@ -30,6 +32,7 @@ func init() {
3032
var _ = ginkgo.Describe("[Devnet Connection]", func() {
3133
tc := e2e.NewTestContext()
3234
require := require.New(tc)
35+
ctx := context.Background()
3336

3437
var devnetConfig DevnetConfig
3538

@@ -54,7 +57,10 @@ var _ = ginkgo.Describe("[Devnet Connection]", func() {
5457

5558
pks := make([]string, len(keys))
5659
for i, key := range keys {
57-
pks[i] = string(key.Bytes())
60+
b, err := key.MarshalJSON()
61+
require.NoError(err)
62+
63+
pks[i] = string(b)
5864
}
5965

6066
devnetConfig = DevnetConfig{
@@ -64,10 +70,21 @@ var _ = ginkgo.Describe("[Devnet Connection]", func() {
6470
})
6571

6672
ginkgo.It("can connect to an existing network", func() {
73+
workers := ConnectNetwork(tc, devnetConfig)
74+
75+
client := workers[0].Client
76+
chainID, err := client.ChainID(ctx)
77+
require.NoError(err)
78+
79+
test := TransferTest{
80+
Value: big.NewInt(1),
81+
}
82+
6783
registry := prometheus.NewRegistry()
68-
metricsServer, err := tests.NewPrometheusServer(registry)
84+
generator, err := NewLoadGenerator(workers, chainID, "devnet-connection-test", registry, test)
6985
require.NoError(err)
7086

71-
_ = ConnectNetwork(tc, metricsServer, devnetConfig)
87+
timeout := 30 * time.Second
88+
generator.Run(ctx, tc.Log(), timeout, timeout)
7289
})
7390
})

0 commit comments

Comments
 (0)