Skip to content

Commit 7bf40e1

Browse files
feat(telemetry): send telemetry messages when GRANDPA receieves commit or vote messages (ChainSafe#2015)
* telemetry when GRANDPA receieve commit or vote messages Send `afg.received_commit` when grandpa receives a commit message. Send `afg.received_precommit` or `afg.received_prevote` when grandpa receives a vote message Closes ChainSafe#1840 Closes ChainSafe#1839 Closes ChainSafe#1838
1 parent c17b53a commit 7bf40e1

File tree

7 files changed

+141
-20
lines changed

7 files changed

+141
-20
lines changed

dot/telemetry/afg_received.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright 2021 ChainSafe Systems (ON)
2+
// SPDX-License-Identifier: LGPL-3.0-only
3+
4+
package telemetry
5+
6+
import "github.com/ChainSafe/gossamer/lib/common"
7+
8+
// AfG ("Al's Finality Gadget") is synonymous with GRANDPA.
9+
10+
type afgReceivedTM struct {
11+
TargetHash common.Hash `json:"target_hash"`
12+
TargetNumber string `json:"target_number"`
13+
Voter string `json:"voter"`
14+
}
15+
16+
// afgReceivedPrecommitTM holds `afg.received_precommit` telemetry message which is
17+
// supposed to be sent when grandpa client receives a precommit.
18+
type afgReceivedPrecommitTM afgReceivedTM
19+
20+
// NewAfgReceivedPrecommitTM gets a new afgReceivedPrecommitTM struct.
21+
func NewAfgReceivedPrecommitTM(targetHash common.Hash, targetNumber, voter string) Message {
22+
return &afgReceivedPrecommitTM{
23+
TargetHash: targetHash,
24+
TargetNumber: targetNumber,
25+
Voter: voter,
26+
}
27+
}
28+
29+
func (afgReceivedPrecommitTM) messageType() string {
30+
return afgReceivedPrecommitMsg
31+
}
32+
33+
// afgReceivedPrevoteTM holds `afg.received_prevote` telemetry message which is
34+
// supposed to be sent when grandpa client receives a prevote.
35+
type afgReceivedPrevoteTM afgReceivedTM
36+
37+
// NewAfgReceivedPrevoteTM gets a new afgReceivedPrevoteTM struct.
38+
func NewAfgReceivedPrevoteTM(targetHash common.Hash, targetNumber, voter string) Message {
39+
return &afgReceivedPrevoteTM{
40+
TargetHash: targetHash,
41+
TargetNumber: targetNumber,
42+
Voter: voter,
43+
}
44+
}
45+
46+
func (afgReceivedPrevoteTM) messageType() string {
47+
return afgReceivedPrevoteMsg
48+
}
49+
50+
// afgReceivedCommitTM holds `afg.received_commit` telemetry message which is
51+
// supposed to be sent when grandpa client receives a commit.
52+
type afgReceivedCommitTM struct {
53+
TargetHash common.Hash `json:"target_hash"`
54+
TargetNumber string `json:"target_number"`
55+
ContainsPrecommitsSignedBy []string `json:"contains_precommits_signed_by"`
56+
}
57+
58+
// NewAfgReceivedCommitTM gets a new afgReceivedCommitTM struct.
59+
func NewAfgReceivedCommitTM(targetHash common.Hash, targetNumber string, containsPrecommitsSignedBy []string) Message {
60+
return &afgReceivedCommitTM{
61+
TargetHash: targetHash,
62+
TargetNumber: targetNumber,
63+
ContainsPrecommitsSignedBy: containsPrecommitsSignedBy,
64+
}
65+
}
66+
67+
func (afgReceivedCommitTM) messageType() string {
68+
return afgReceivedCommitMsg
69+
}

dot/telemetry/telemetry.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ import (
1616

1717
// telemetry message types
1818
const (
19+
notifyFinalizedMsg = "notify.finalized"
20+
blockImportMsg = "block.import"
21+
systemNetworkStateMsg = "system.network_state"
1922
systemConnectedMsg = "system.connected"
2023
systemIntervalMsg = "system.interval"
21-
systemNetworkStateMsg = "system.network_state"
22-
blockImportMsg = "block.import"
23-
notifyFinalizedMsg = "notify.finalized"
24+
afgReceivedPrecommitMsg = "afg.received_precommit"
25+
afgReceivedPrevoteMsg = "afg.received_prevote"
26+
afgReceivedCommitMsg = "afg.received_commit"
2427
txPoolImportMsg = "txpool.import"
2528
preparedBlockForProposingMsg = "prepared_block_for_proposing"
2629
)

dot/telemetry/telemetry_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ func TestHandler_SendMulti(t *testing.T) {
5353
[]byte(`{"best":"0x07b749b6e20fd5f1159153a2e790235018621dd06072a62bcd25e8576f6ff5e6","height":"32375","msg":"notify.finalized","ts":`), //nolint:lll
5454
[]byte(`{"hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","msg":"prepared_block_for_proposing","number":"1","ts":`), //nolint:lll
5555
[]byte(`{"future":2,"msg":"txpool.import","ready":1,"ts":`),
56+
[]byte(`{"contains_precommits_signed_by":[],"msg":"afg.received_commit","target_hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","target_number":"1","ts":`), //nolint:lll
57+
[]byte(`{"msg":"afg.received_precommit","target_hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","target_number":"1","ts":`), //nolint:lll
58+
[]byte(`{"msg":"afg.received_prevote","target_hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","target_number":"1","ts":`), //nolint:lll
5659
}
5760

5861
messages := []Message{
@@ -76,6 +79,16 @@ func TestHandler_SendMulti(t *testing.T) {
7679
common.MustHexToHash("0x687197c11b4cf95374159843e7f46fbcd63558db981aaef01a8bac2a44a1d6b2"),
7780
),
7881

82+
NewAfgReceivedCommitTM(
83+
common.MustHexToHash("0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c"),
84+
"1", []string{}),
85+
NewAfgReceivedPrecommitTM(
86+
common.MustHexToHash("0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c"),
87+
"1", ""),
88+
NewAfgReceivedPrevoteTM(
89+
common.MustHexToHash("0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c"),
90+
"1", ""),
91+
7992
NewNotifyFinalizedTM(
8093
common.MustHexToHash("0x07b749b6e20fd5f1159153a2e790235018621dd06072a62bcd25e8576f6ff5e6"),
8194
"32375"),

dot/telemetry/txpool_import.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
1-
// Copyright 2021 ChainSafe Systems (ON) Corp.
2-
// This file is part of gossamer.
3-
//
4-
// The gossamer library is free software: you can redistribute it and/or modify
5-
// it under the terms of the GNU Lesser General Public License as published by
6-
// the Free Software Foundation, either version 3 of the License, or
7-
// (at your option) any later version.
8-
//
9-
// The gossamer library is distributed in the hope that it will be useful,
10-
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11-
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12-
// GNU Lesser General Public License for more details.
13-
//
14-
// You should have received a copy of the GNU Lesser General Public License
15-
// along with the gossamer library. If not, see <http://www.gnu.org/licenses/>.
1+
// Copyright 2021 ChainSafe Systems (ON)
2+
// SPDX-License-Identifier: LGPL-3.0-only
163

174
package telemetry
185

lib/grandpa/grandpa.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ func (s *Service) playGrandpaRound() error {
483483
go s.sendVoteMessage(prevote, vm, roundComplete)
484484

485485
logger.Debug("receiving pre-commit messages...")
486+
// through goroutine s.receiveMessages(ctx)
486487
time.Sleep(s.interval)
487488

488489
if s.paused.Load().(bool) {
@@ -526,9 +527,10 @@ func (s *Service) sendVoteMessage(stage Subround, msg *VoteMessage, roundComplet
526527

527528
if err := s.sendMessage(msg); err != nil {
528529
logger.Warnf("could not send message for stage %s: %s", stage, err)
530+
} else {
531+
logger.Tracef("sent vote message for stage %s: %s", stage, msg.Message)
529532
}
530533

531-
logger.Tracef("sent vote message for stage %s: %s", stage, msg.Message)
532534
select {
533535
case <-roundComplete:
534536
return

lib/grandpa/message_handler.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"reflect"
1212

1313
"github.com/ChainSafe/gossamer/dot/network"
14+
"github.com/ChainSafe/gossamer/dot/telemetry"
1415
"github.com/ChainSafe/gossamer/dot/types"
1516
"github.com/ChainSafe/gossamer/lib/blocktree"
1617
"github.com/ChainSafe/gossamer/lib/common"
@@ -91,7 +92,24 @@ func (h *MessageHandler) handleNeighbourMessage(msg *NeighbourMessage) error {
9192
}
9293

9394
func (h *MessageHandler) handleCommitMessage(msg *CommitMessage) error {
94-
logger.Debugf("received commit message %v", msg)
95+
logger.Debugf("received commit message, msg: %+v", msg)
96+
97+
containsPrecommitsSignedBy := make([]string, len(msg.AuthData))
98+
for i, authData := range msg.AuthData {
99+
containsPrecommitsSignedBy[i] = authData.AuthorityID.String()
100+
}
101+
102+
err := telemetry.GetInstance().SendMessage(
103+
telemetry.NewAfgReceivedCommitTM(
104+
msg.Vote.Hash,
105+
fmt.Sprint(msg.Vote.Number),
106+
containsPrecommitsSignedBy,
107+
),
108+
)
109+
if err != nil {
110+
logger.Debugf("problem sending afg.received_commit telemetry message: %s", err)
111+
}
112+
95113
if has, _ := h.blockState.HasFinalisedBlock(msg.Round, h.grandpa.state.setID); has {
96114
return nil
97115
}

lib/grandpa/vote_message.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"bytes"
88
"context"
99
"errors"
10+
"fmt"
1011

12+
"github.com/ChainSafe/gossamer/dot/telemetry"
1113
"github.com/ChainSafe/gossamer/lib/blocktree"
1214
"github.com/ChainSafe/gossamer/lib/crypto/ed25519"
1315
"github.com/ChainSafe/gossamer/pkg/scale"
@@ -36,6 +38,33 @@ func (s *Service) receiveMessages(ctx context.Context) {
3638
logger.Tracef("received vote message %v from %s", msg.msg, msg.from)
3739
vm := msg.msg
3840

41+
switch vm.Message.Stage {
42+
case prevote:
43+
err := telemetry.GetInstance().SendMessage(
44+
telemetry.NewAfgReceivedPrevoteTM(
45+
vm.Message.Hash,
46+
fmt.Sprint(vm.Message.Number),
47+
vm.Message.AuthorityID.String(),
48+
),
49+
)
50+
if err != nil {
51+
logger.Debugf("problem sending afg.received_prevote telemetry message: %s", err)
52+
}
53+
case precommit:
54+
err := telemetry.GetInstance().SendMessage(
55+
telemetry.NewAfgReceivedPrecommitTM(
56+
vm.Message.Hash,
57+
fmt.Sprint(vm.Message.Number),
58+
vm.Message.AuthorityID.String(),
59+
),
60+
)
61+
if err != nil {
62+
logger.Debugf("problem sending afg.received_precommit telemetry message: %s", err)
63+
}
64+
default:
65+
logger.Warnf("unsupported stage %s", vm.Message.Stage.String())
66+
}
67+
3968
v, err := s.validateMessage(msg.from, vm)
4069
if err != nil {
4170
logger.Debugf("failed to validate vote message %v: %s", vm, err)

0 commit comments

Comments
 (0)