mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-09 11:11:20 +00:00
78a25f99c3
* Update fastssz * Merge branch 'master' of github.com:prysmaticlabs/prysm into update-fssz * fmt * gaz * Merge refs/heads/master into update-fssz * goimports * Merge refs/heads/master into update-fssz * Merge refs/heads/master into update-fssz * Merge refs/heads/master into update-fssz * Merge refs/heads/master into update-fssz * Merge refs/heads/master into update-fssz * Fix * fix ethereumapis * fix again * kafka * fix gen file * fix compute signing root * gofmt * checkpoint progress * progress * checkpoint * progress * Fix build * checkpoint * helpers * Another test fixed * gaz * another test fix * gofmt * some fixes * Merge branch 'master' of github.com:prysmaticlabs/prysm into update-fssz * fix one test * Merge branch 'master' of github.com:prysmaticlabs/prysm into update-fssz * fill empty checkpoint roots * more padding * more padding * Fix //beacon-chain/rpc/debug:go_default_test * fix //beacon-chain/core/state:go_default_test * fix //beacon-chain/core/state:go_default_test * fix some htr errors * fix //slasher/rpc:go_default_test * Progress on //beacon-chain/core/blocks:go_default_test * Progress on //beacon-chain/core/blocks:go_default_test * Progress on //beacon-chain/core/blocks:go_default_test * fix //slasher/db/kv:go_default_test * progress * fix //beacon-chain/sync/initial-sync:go_raceon_test * gofmt and gaz * fix one more test, taking a break * Fix //beacon-chain/core/blocks:go_default_test * Complete beacon-chain/powchain * Do most of beacon-chain/rpc/beacon/ * Do most of beacon-chain/blockchain * fix //beacon-chain/operations/attestations/kv:go_default_test * Fix //beacon-chain/cache/depositcache:go_default_test * Fix //slasher/detection:go_default_test * Progress * fix //beacon-chain/rpc/validator:go_default_test * gofmt * fix //validator/client:go_default_test * fix * fix //beacon-chain/blockchain:go_raceoff_test * fix //beacon-chain/rpc/beacon:go_default_test * fix 1 of 4 shards in //beacon-chain/sync:go_default_test * Fix //beacon-chain/sync:go_default_test and gofmt * prevent panic * fix //beacon-chain/state/stategen:go_default_test * fix * Merge branch 'master' of github.com:prysmaticlabs/prysm into update-fssz * fix most tests * Self review, go mod tidy, run regen scripts * fix slasher * Update ethereumapis * disable spawn strategy override * Merge refs/heads/master into update-fssz * Merge refs/heads/master into update-fssz * Remove extra line in imports * Remove extra line in imports * Gofmt * PR feedback from @nisdas
113 lines
3.1 KiB
Go
113 lines
3.1 KiB
Go
// Package kafka defines an implementation of Database interface
|
|
// which exports streaming data using Kafka for data analysis.
|
|
package kafka
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
|
|
fssz "github.com/ferranbt/fastssz"
|
|
"github.com/golang/protobuf/jsonpb"
|
|
"github.com/golang/protobuf/proto"
|
|
eth "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
|
"github.com/prysmaticlabs/go-ssz"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/db/iface"
|
|
"github.com/prysmaticlabs/prysm/shared/featureconfig"
|
|
"github.com/prysmaticlabs/prysm/shared/traceutil"
|
|
"github.com/sirupsen/logrus"
|
|
"go.opencensus.io/trace"
|
|
"gopkg.in/confluentinc/confluent-kafka-go.v1/kafka"
|
|
_ "gopkg.in/confluentinc/confluent-kafka-go.v1/kafka/librdkafka" // Required for c++ kafka library.
|
|
)
|
|
|
|
var _ = iface.Database(&Exporter{})
|
|
var log = logrus.WithField("prefix", "exporter")
|
|
var marshaler = &jsonpb.Marshaler{}
|
|
|
|
// Exporter wraps a database interface and exports certain objects to kafka topics.
|
|
type Exporter struct {
|
|
db iface.Database
|
|
p *kafka.Producer
|
|
}
|
|
|
|
// Wrap the db with kafka exporter. If the feature flag is not enabled, this service does not wrap
|
|
// the database, but returns the underlying database pointer itself.
|
|
func Wrap(db iface.Database) (iface.Database, error) {
|
|
if featureconfig.Get().KafkaBootstrapServers == "" {
|
|
log.Debug("Empty Kafka bootstrap servers list, database was not wrapped with Kafka exporter")
|
|
return db, nil
|
|
}
|
|
|
|
p, err := kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": featureconfig.Get().KafkaBootstrapServers})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Exporter{db: db, p: p}, nil
|
|
}
|
|
|
|
func (e Exporter) publish(ctx context.Context, topic string, msg proto.Message) error {
|
|
ctx, span := trace.StartSpan(ctx, "kafka.publish")
|
|
defer span.End()
|
|
|
|
buf := bytes.NewBuffer(nil)
|
|
if err := marshaler.Marshal(buf, msg); err != nil {
|
|
traceutil.AnnotateError(span, err)
|
|
return err
|
|
}
|
|
|
|
var key [32]byte
|
|
var err error
|
|
if v, ok := msg.(fssz.HashRoot); ok {
|
|
key, err = v.HashTreeRoot()
|
|
} else {
|
|
key, err = ssz.HashTreeRoot(msg)
|
|
}
|
|
if err != nil {
|
|
traceutil.AnnotateError(span, err)
|
|
return err
|
|
}
|
|
|
|
if err := e.p.Produce(&kafka.Message{
|
|
TopicPartition: kafka.TopicPartition{
|
|
Topic: &topic,
|
|
},
|
|
Value: buf.Bytes(),
|
|
Key: key[:],
|
|
}, nil); err != nil {
|
|
traceutil.AnnotateError(span, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Close closes kafka producer and underlying db.
|
|
func (e Exporter) Close() error {
|
|
e.p.Close()
|
|
return e.db.Close()
|
|
}
|
|
|
|
// SaveBlock publishes to the kafka topic for beacon blocks.
|
|
func (e Exporter) SaveBlock(ctx context.Context, block *eth.SignedBeaconBlock) error {
|
|
go func() {
|
|
if err := e.publish(ctx, "beacon_block", block); err != nil {
|
|
log.WithError(err).Error("Failed to publish block")
|
|
}
|
|
}()
|
|
|
|
return e.db.SaveBlock(ctx, block)
|
|
}
|
|
|
|
// SaveBlocks publishes to the kafka topic for beacon blocks.
|
|
func (e Exporter) SaveBlocks(ctx context.Context, blocks []*eth.SignedBeaconBlock) error {
|
|
go func() {
|
|
for _, block := range blocks {
|
|
if err := e.publish(ctx, "beacon_block", block); err != nil {
|
|
log.WithError(err).Error("Failed to publish block")
|
|
}
|
|
}
|
|
}()
|
|
|
|
return e.db.SaveBlocks(ctx, blocks)
|
|
}
|