From 7bf40e159cf11ae4e3486a136da21848a533d0da Mon Sep 17 00:00:00 2001 From: Kishan Sagathiya Date: Tue, 30 Nov 2021 13:13:10 +0530 Subject: [PATCH] feat(telemetry): send telemetry messages when GRANDPA receieves commit or vote messages (#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 #1840 Closes #1839 Closes #1838 --- dot/telemetry/afg_received.go | 69 +++++++++++++++++++++++++++++++++ dot/telemetry/telemetry.go | 9 +++-- dot/telemetry/telemetry_test.go | 13 +++++++ dot/telemetry/txpool_import.go | 17 +------- lib/grandpa/grandpa.go | 4 +- lib/grandpa/message_handler.go | 20 +++++++++- lib/grandpa/vote_message.go | 29 ++++++++++++++ 7 files changed, 141 insertions(+), 20 deletions(-) create mode 100644 dot/telemetry/afg_received.go diff --git a/dot/telemetry/afg_received.go b/dot/telemetry/afg_received.go new file mode 100644 index 0000000000..299cd1e3cd --- /dev/null +++ b/dot/telemetry/afg_received.go @@ -0,0 +1,69 @@ +// Copyright 2021 ChainSafe Systems (ON) +// SPDX-License-Identifier: LGPL-3.0-only + +package telemetry + +import "github.com/ChainSafe/gossamer/lib/common" + +// AfG ("Al's Finality Gadget") is synonymous with GRANDPA. + +type afgReceivedTM struct { + TargetHash common.Hash `json:"target_hash"` + TargetNumber string `json:"target_number"` + Voter string `json:"voter"` +} + +// afgReceivedPrecommitTM holds `afg.received_precommit` telemetry message which is +// supposed to be sent when grandpa client receives a precommit. +type afgReceivedPrecommitTM afgReceivedTM + +// NewAfgReceivedPrecommitTM gets a new afgReceivedPrecommitTM struct. +func NewAfgReceivedPrecommitTM(targetHash common.Hash, targetNumber, voter string) Message { + return &afgReceivedPrecommitTM{ + TargetHash: targetHash, + TargetNumber: targetNumber, + Voter: voter, + } +} + +func (afgReceivedPrecommitTM) messageType() string { + return afgReceivedPrecommitMsg +} + +// afgReceivedPrevoteTM holds `afg.received_prevote` telemetry message which is +// supposed to be sent when grandpa client receives a prevote. +type afgReceivedPrevoteTM afgReceivedTM + +// NewAfgReceivedPrevoteTM gets a new afgReceivedPrevoteTM struct. +func NewAfgReceivedPrevoteTM(targetHash common.Hash, targetNumber, voter string) Message { + return &afgReceivedPrevoteTM{ + TargetHash: targetHash, + TargetNumber: targetNumber, + Voter: voter, + } +} + +func (afgReceivedPrevoteTM) messageType() string { + return afgReceivedPrevoteMsg +} + +// afgReceivedCommitTM holds `afg.received_commit` telemetry message which is +// supposed to be sent when grandpa client receives a commit. +type afgReceivedCommitTM struct { + TargetHash common.Hash `json:"target_hash"` + TargetNumber string `json:"target_number"` + ContainsPrecommitsSignedBy []string `json:"contains_precommits_signed_by"` +} + +// NewAfgReceivedCommitTM gets a new afgReceivedCommitTM struct. +func NewAfgReceivedCommitTM(targetHash common.Hash, targetNumber string, containsPrecommitsSignedBy []string) Message { + return &afgReceivedCommitTM{ + TargetHash: targetHash, + TargetNumber: targetNumber, + ContainsPrecommitsSignedBy: containsPrecommitsSignedBy, + } +} + +func (afgReceivedCommitTM) messageType() string { + return afgReceivedCommitMsg +} diff --git a/dot/telemetry/telemetry.go b/dot/telemetry/telemetry.go index fd0a1c0b6b..c5285494c0 100644 --- a/dot/telemetry/telemetry.go +++ b/dot/telemetry/telemetry.go @@ -16,11 +16,14 @@ import ( // telemetry message types const ( + notifyFinalizedMsg = "notify.finalized" + blockImportMsg = "block.import" + systemNetworkStateMsg = "system.network_state" systemConnectedMsg = "system.connected" systemIntervalMsg = "system.interval" - systemNetworkStateMsg = "system.network_state" - blockImportMsg = "block.import" - notifyFinalizedMsg = "notify.finalized" + afgReceivedPrecommitMsg = "afg.received_precommit" + afgReceivedPrevoteMsg = "afg.received_prevote" + afgReceivedCommitMsg = "afg.received_commit" txPoolImportMsg = "txpool.import" preparedBlockForProposingMsg = "prepared_block_for_proposing" ) diff --git a/dot/telemetry/telemetry_test.go b/dot/telemetry/telemetry_test.go index 0caad81fec..eef1c59805 100644 --- a/dot/telemetry/telemetry_test.go +++ b/dot/telemetry/telemetry_test.go @@ -53,6 +53,9 @@ func TestHandler_SendMulti(t *testing.T) { []byte(`{"best":"0x07b749b6e20fd5f1159153a2e790235018621dd06072a62bcd25e8576f6ff5e6","height":"32375","msg":"notify.finalized","ts":`), //nolint:lll []byte(`{"hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","msg":"prepared_block_for_proposing","number":"1","ts":`), //nolint:lll []byte(`{"future":2,"msg":"txpool.import","ready":1,"ts":`), + []byte(`{"contains_precommits_signed_by":[],"msg":"afg.received_commit","target_hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","target_number":"1","ts":`), //nolint:lll + []byte(`{"msg":"afg.received_precommit","target_hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","target_number":"1","ts":`), //nolint:lll + []byte(`{"msg":"afg.received_prevote","target_hash":"0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c","target_number":"1","ts":`), //nolint:lll } messages := []Message{ @@ -76,6 +79,16 @@ func TestHandler_SendMulti(t *testing.T) { common.MustHexToHash("0x687197c11b4cf95374159843e7f46fbcd63558db981aaef01a8bac2a44a1d6b2"), ), + NewAfgReceivedCommitTM( + common.MustHexToHash("0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c"), + "1", []string{}), + NewAfgReceivedPrecommitTM( + common.MustHexToHash("0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c"), + "1", ""), + NewAfgReceivedPrevoteTM( + common.MustHexToHash("0x5814aec3e28527f81f65841e034872f3a30337cf6c33b2d258bba6071e37e27c"), + "1", ""), + NewNotifyFinalizedTM( common.MustHexToHash("0x07b749b6e20fd5f1159153a2e790235018621dd06072a62bcd25e8576f6ff5e6"), "32375"), diff --git a/dot/telemetry/txpool_import.go b/dot/telemetry/txpool_import.go index eb5abec889..9da38c1a58 100644 --- a/dot/telemetry/txpool_import.go +++ b/dot/telemetry/txpool_import.go @@ -1,18 +1,5 @@ -// Copyright 2021 ChainSafe Systems (ON) Corp. -// This file is part of gossamer. -// -// The gossamer library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The gossamer library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the gossamer library. If not, see . +// Copyright 2021 ChainSafe Systems (ON) +// SPDX-License-Identifier: LGPL-3.0-only package telemetry diff --git a/lib/grandpa/grandpa.go b/lib/grandpa/grandpa.go index c34a588490..0b1aeab9ae 100644 --- a/lib/grandpa/grandpa.go +++ b/lib/grandpa/grandpa.go @@ -483,6 +483,7 @@ func (s *Service) playGrandpaRound() error { go s.sendVoteMessage(prevote, vm, roundComplete) logger.Debug("receiving pre-commit messages...") + // through goroutine s.receiveMessages(ctx) time.Sleep(s.interval) if s.paused.Load().(bool) { @@ -526,9 +527,10 @@ func (s *Service) sendVoteMessage(stage Subround, msg *VoteMessage, roundComplet if err := s.sendMessage(msg); err != nil { logger.Warnf("could not send message for stage %s: %s", stage, err) + } else { + logger.Tracef("sent vote message for stage %s: %s", stage, msg.Message) } - logger.Tracef("sent vote message for stage %s: %s", stage, msg.Message) select { case <-roundComplete: return diff --git a/lib/grandpa/message_handler.go b/lib/grandpa/message_handler.go index 45843f7719..57dd870449 100644 --- a/lib/grandpa/message_handler.go +++ b/lib/grandpa/message_handler.go @@ -11,6 +11,7 @@ import ( "reflect" "github.com/ChainSafe/gossamer/dot/network" + "github.com/ChainSafe/gossamer/dot/telemetry" "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/lib/blocktree" "github.com/ChainSafe/gossamer/lib/common" @@ -91,7 +92,24 @@ func (h *MessageHandler) handleNeighbourMessage(msg *NeighbourMessage) error { } func (h *MessageHandler) handleCommitMessage(msg *CommitMessage) error { - logger.Debugf("received commit message %v", msg) + logger.Debugf("received commit message, msg: %+v", msg) + + containsPrecommitsSignedBy := make([]string, len(msg.AuthData)) + for i, authData := range msg.AuthData { + containsPrecommitsSignedBy[i] = authData.AuthorityID.String() + } + + err := telemetry.GetInstance().SendMessage( + telemetry.NewAfgReceivedCommitTM( + msg.Vote.Hash, + fmt.Sprint(msg.Vote.Number), + containsPrecommitsSignedBy, + ), + ) + if err != nil { + logger.Debugf("problem sending afg.received_commit telemetry message: %s", err) + } + if has, _ := h.blockState.HasFinalisedBlock(msg.Round, h.grandpa.state.setID); has { return nil } diff --git a/lib/grandpa/vote_message.go b/lib/grandpa/vote_message.go index 0f8ede2c66..07f5b798e2 100644 --- a/lib/grandpa/vote_message.go +++ b/lib/grandpa/vote_message.go @@ -7,7 +7,9 @@ import ( "bytes" "context" "errors" + "fmt" + "github.com/ChainSafe/gossamer/dot/telemetry" "github.com/ChainSafe/gossamer/lib/blocktree" "github.com/ChainSafe/gossamer/lib/crypto/ed25519" "github.com/ChainSafe/gossamer/pkg/scale" @@ -36,6 +38,33 @@ func (s *Service) receiveMessages(ctx context.Context) { logger.Tracef("received vote message %v from %s", msg.msg, msg.from) vm := msg.msg + switch vm.Message.Stage { + case prevote: + err := telemetry.GetInstance().SendMessage( + telemetry.NewAfgReceivedPrevoteTM( + vm.Message.Hash, + fmt.Sprint(vm.Message.Number), + vm.Message.AuthorityID.String(), + ), + ) + if err != nil { + logger.Debugf("problem sending afg.received_prevote telemetry message: %s", err) + } + case precommit: + err := telemetry.GetInstance().SendMessage( + telemetry.NewAfgReceivedPrecommitTM( + vm.Message.Hash, + fmt.Sprint(vm.Message.Number), + vm.Message.AuthorityID.String(), + ), + ) + if err != nil { + logger.Debugf("problem sending afg.received_precommit telemetry message: %s", err) + } + default: + logger.Warnf("unsupported stage %s", vm.Message.Stage.String()) + } + v, err := s.validateMessage(msg.from, vm) if err != nil { logger.Debugf("failed to validate vote message %v: %s", vm, err)