daemon

package
v1.1.17 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 15, 2026 License: MIT Imports: 22 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AuditLogger added in v1.1.9

type AuditLogger struct {
	// contains filtered or unexported fields
}

AuditLogger handles creating audit log entries with proper diff generation

func NewAuditLogger added in v1.1.9

func NewAuditLogger(daemon *Daemon, userHeader string, defaultUser string) *AuditLogger

NewAuditLogger creates a new audit logger instance

func (*AuditLogger) GetUserFromRequest added in v1.1.9

func (al *AuditLogger) GetUserFromRequest(headers map[string][]string) string

GetUserFromRequest extracts the user email from the request header

func (*AuditLogger) LogClientUpdate added in v1.1.9

func (al *AuditLogger) LogClientUpdate(tx *sqlx.Tx, userEmail string, rpcURL string, clientName string, changes map[string]interface{}) error

LogClientUpdate logs a client configuration update with specific action types

func (*AuditLogger) LogRootWalletTransaction added in v1.1.10

func (al *AuditLogger) LogRootWalletTransaction(userEmail string, toAddress string, valueWei string, txHash string, gasLimit uint64, maxFee string, maxTip string, data string) error

LogRootWalletTransaction logs a transaction sent from the root wallet

func (*AuditLogger) LogSpammerAction added in v1.1.9

func (al *AuditLogger) LogSpammerAction(userEmail string, action db.AuditActionType, spammerID int64, name string, metadata db.AuditMetadata) error

LogSpammerAction logs simple spammer actions (start, pause, reclaim)

func (*AuditLogger) LogSpammerCreate added in v1.1.9

func (al *AuditLogger) LogSpammerCreate(tx *sqlx.Tx, userEmail string, spammerID int64, name string, scenario string, config string) error

LogSpammerCreate logs a spammer creation action

func (*AuditLogger) LogSpammerDelete added in v1.1.9

func (al *AuditLogger) LogSpammerDelete(tx *sqlx.Tx, userEmail string, spammerID int64, name string) error

LogSpammerDelete logs a spammer deletion action

func (*AuditLogger) LogSpammerUpdate added in v1.1.9

func (al *AuditLogger) LogSpammerUpdate(tx *sqlx.Tx, userEmail string, spammerID int64, oldName, newName, oldDesc, newDesc, oldConfig, newConfig string) error

LogSpammerUpdate logs a spammer update action

func (*AuditLogger) LogSpammersExport added in v1.1.9

func (al *AuditLogger) LogSpammersExport(userEmail string, exportedIDs []int64) error

LogSpammersExport logs a spammers export action

func (*AuditLogger) LogSpammersImport added in v1.1.9

func (al *AuditLogger) LogSpammersImport(userEmail string, importedCount int, skippedCount int, source string) error

LogSpammersImport logs a spammers import action

type BlockDataPoint added in v1.1.6

type BlockDataPoint struct {
	Timestamp        time.Time                    `json:"timestamp"`
	StartBlockNumber uint64                       `json:"startBlockNumber"`
	EndBlockNumber   uint64                       `json:"endBlockNumber"`
	BlockCount       uint64                       `json:"blockCount"`
	TotalGasUsed     uint64                       `json:"totalGasUsed"`
	SpammerGasData   map[uint64]*SpammerBlockData `json:"spammerGasData"` // spammerID -> data
	OthersGasUsed    uint64                       `json:"othersGasUsed"`
}

BlockDataPoint represents metrics for one or more blocks (based on granularity)

type Daemon

type Daemon struct {
	// contains filtered or unexported fields
}

Daemon manages multiple spammer instances with database persistence and graceful shutdown. It orchestrates the lifecycle of spammers including restoration from database, global configuration management, and coordinated shutdown with a 10-second timeout.

func NewDaemon

func NewDaemon(parentCtx context.Context, logger logrus.FieldLogger, clientPool *spamoor.ClientPool, txpool *spamoor.TxPool, db *db.Database) *Daemon

NewDaemon creates a new daemon instance with the provided components. It initializes a cancellable context, spammer map, and global configuration map. The daemon manages spammer instances and handles their lifecycle.

func (*Daemon) DeleteSpammer

func (d *Daemon) DeleteSpammer(id int64, userEmail string) error

DeleteSpammer removes a spammer from both the daemon and database. If the spammer is running, it will be paused first before deletion. Returns an error if the spammer is not found or if database deletion fails.

func (*Daemon) ExportSpammers added in v1.1.5

func (d *Daemon) ExportSpammers(spammerIDs ...int64) (string, error)

ExportSpammers exports the specified spammer IDs to YAML format. If no IDs are provided, exports all spammers. Returns the YAML string representation of the spammers.

func (*Daemon) GetAllSpammers

func (d *Daemon) GetAllSpammers() []*Spammer

GetAllSpammers returns all spammer instances sorted by ID in descending order. This provides a snapshot of all active spammer instances managed by the daemon. The returned slice is safe to modify as it's a copy.

func (*Daemon) GetAuditLogger added in v1.1.9

func (d *Daemon) GetAuditLogger() *AuditLogger

GetAuditLogger returns the audit logger

func (*Daemon) GetClientConfig added in v1.1.9

func (d *Daemon) GetClientConfig(rpcUrl string) (*db.ClientConfig, error)

GetClientConfig retrieves the configuration for a specific client from the database.

func (*Daemon) GetClientPool

func (d *Daemon) GetClientPool() *spamoor.ClientPool

GetClientPool returns the RPC client pool used by all spammers. This provides access to the Ethereum client connections for transaction submission.

func (*Daemon) GetDatabase added in v1.1.9

func (d *Daemon) GetDatabase() *db.Database

GetDatabase returns the database instance

func (*Daemon) GetGlobalCfg added in v1.1.3

func (d *Daemon) GetGlobalCfg() map[string]interface{}

GetGlobalCfg returns the global configuration map that contains shared configuration values accessible to all spammer instances.

func (*Daemon) GetLongWindowMetrics added in v1.1.6

func (d *Daemon) GetLongWindowMetrics() *MultiGranularityMetrics

GetLongWindowMetrics returns the 6-hour per-32-block metrics for the dashboard

func (*Daemon) GetMetricsCollector added in v1.1.6

func (d *Daemon) GetMetricsCollector() *TxPoolMetricsCollector

GetMetricsCollector returns the TxPool metrics collector for real-time subscriptions

func (*Daemon) GetRootWallet

func (d *Daemon) GetRootWallet() *spamoor.RootWallet

GetRootWallet returns the root wallet used for funding spammer wallets. This provides access to the main wallet that distributes funds to child wallets.

func (*Daemon) GetShortWindowMetrics added in v1.1.6

func (d *Daemon) GetShortWindowMetrics() *MultiGranularityMetrics

GetShortWindowMetrics returns the 30-minute per-block metrics for the dashboard

func (*Daemon) GetSpammer

func (d *Daemon) GetSpammer(id int64) *Spammer

GetSpammer retrieves a spammer instance by ID from the internal map. Returns nil if the spammer with the given ID does not exist. This method is thread-safe using read locks.

func (*Daemon) GetSpammerName added in v1.1.6

func (d *Daemon) GetSpammerName(spammerID uint64) string

GetSpammerName returns the name of a spammer by ID for metrics dashboard

func (*Daemon) GetStartupDelayRemaining added in v1.1.10

func (d *Daemon) GetStartupDelayRemaining() time.Duration

GetStartupDelayRemaining returns the remaining time in the startup delay period. Returns 0 if the delay has expired or was not set.

func (*Daemon) GetTxPool added in v1.1.10

func (d *Daemon) GetTxPool() *spamoor.TxPool

GetTxPool returns the transaction pool for sending transactions

func (*Daemon) ImportSpammers added in v1.1.5

func (d *Daemon) ImportSpammers(input string, userEmail string) (*ImportResult, error)

ImportSpammers imports spammers from YAML data, file path, or URL. Handles deduplication by checking name combinations and validates before importing. Returns validation results and the number of spammers imported.

func (*Daemon) ImportSpammersOnStartup added in v1.1.5

func (d *Daemon) ImportSpammersOnStartup(source string, logger logrus.FieldLogger) error

ImportSpammersOnStartup imports spammers from a file or URL on startup. This method reuses the import functionality but starts the spammers after importing them, which is the key difference from regular imports. Only imports on first startup for safety.

func (*Daemon) InitializeMetrics added in v1.1.5

func (d *Daemon) InitializeMetrics() error

func (*Daemon) InitializeTxPoolMetrics added in v1.1.6

func (d *Daemon) InitializeTxPoolMetrics() error

func (*Daemon) IsInStartupDelay added in v1.1.10

func (d *Daemon) IsInStartupDelay() bool

IsInStartupDelay checks if the daemon is still within the startup delay period. Returns true if we're still within the delay period, false otherwise.

func (*Daemon) LoadAndApplyClientConfigs added in v1.1.10

func (d *Daemon) LoadAndApplyClientConfigs() error

LoadAndApplyClientConfigs retrieves client configurations from the database and applies them to the corresponding clients in the client pool. This merges database settings with flag-provided settings according to the rules: - Name and enabled state from DB take precedence over flags - Tags are combined (flags + database tags)

func (*Daemon) NewMetricsCollector added in v1.1.5

func (d *Daemon) NewMetricsCollector() *MetricsCollector

NewMetricsCollector creates and registers all metrics

func (*Daemon) NewSpammer

func (d *Daemon) NewSpammer(scenarioName string, config string, name string, description string, startImmediately bool, userEmail string, isImport bool) (*Spammer, error)

NewSpammer creates a new spammer instance with the specified configuration. It validates the config, generates a unique ID (starting from 100), persists to database, and optionally starts execution immediately. The ID counter is stored in database state.

func (*Daemon) PauseSpammer added in v1.1.9

func (d *Daemon) PauseSpammer(id int64, userEmail string) error

PauseSpammer pauses a spammer and logs the action

func (*Daemon) ReclaimSpammer added in v1.1.4

func (d *Daemon) ReclaimSpammer(id int64, userEmail string) error

ReclaimSpammer reclaims funds from all wallets in the spammer's wallet pool. This transfers remaining ETH back to the root wallet for reuse. Returns an error if the spammer is not found or if fund reclamation fails.

func (*Daemon) Run

func (d *Daemon) Run() (bool, error)

Run initializes the daemon by restoring spammers from the database. Returns true if this is the first launch, false if spammers were restored. Marks the first launch state in the database to track initialization status.

func (*Daemon) SetAuditLogger added in v1.1.9

func (d *Daemon) SetAuditLogger(logger *AuditLogger)

SetAuditLogger sets the audit logger for the daemon

func (*Daemon) SetGlobalCfg added in v1.1.3

func (d *Daemon) SetGlobalCfg(name string, value interface{})

SetGlobalCfg sets a global configuration value that can be accessed by all spammers. This allows sharing configuration data across multiple spammer instances.

func (*Daemon) SetRootWallet added in v1.1.10

func (d *Daemon) SetRootWallet(rootWallet *spamoor.RootWallet)

SetRootWallet sets the root wallet for the daemon. This is used to set the root wallet for the daemon.

func (*Daemon) SetStartupDelay added in v1.1.10

func (d *Daemon) SetStartupDelay(delay time.Duration)

SetStartupDelay sets the startup delay duration for the daemon. This delay prevents spammers from running immediately on startup to allow cancellation.

func (*Daemon) Shutdown

func (d *Daemon) Shutdown()

Shutdown performs a graceful shutdown of the daemon and all running spammers. It cancels the context to stop all spammers, waits up to 10 seconds for them to finish, and closes the database connection. This ensures clean resource cleanup.

func (*Daemon) StartSpammer added in v1.1.9

func (d *Daemon) StartSpammer(id int64, userEmail string) error

StartSpammer starts a spammer and logs the action

func (*Daemon) TrackSpammerStatusChange added in v1.1.5

func (d *Daemon) TrackSpammerStatusChange(spammerID int64, running bool)

TrackSpammerStatusChange updates the spammer running status metric

func (*Daemon) TrackTransactionFailure added in v1.1.5

func (d *Daemon) TrackTransactionFailure(spammerID int64)

TrackTransactionFailure records a failed transaction for metrics

func (*Daemon) TrackTransactionSent added in v1.1.5

func (d *Daemon) TrackTransactionSent(spammerID int64)

TrackTransactionSent records a successful transaction send for metrics

func (*Daemon) UpdateClientConfig added in v1.1.9

func (d *Daemon) UpdateClientConfig(rpcUrl, name, tags, clientType string, enabled bool, userEmail string) error

UpdateClientConfig updates the configuration for a specific client and persists the changes to the database.

func (*Daemon) UpdateSpammer

func (d *Daemon) UpdateSpammer(id int64, name string, description string, config string, userEmail string) error

UpdateSpammer modifies the name, description, and configuration of an existing spammer. The configuration is validated by attempting to unmarshal it into SpammerConfig. Returns an error if the spammer is not found, config is invalid, or database update fails.

type ExportSpammerConfig added in v1.1.5

type ExportSpammerConfig = configs.SpammerConfig

ExportSpammerConfig is an alias for scenario.SpammerConfig to maintain API compatibility

type ImportItem added in v1.1.5

type ImportItem = configs.ConfigImportItem

ImportItem is an alias for scenario.ConfigImportItem to maintain API compatibility

type ImportResult added in v1.1.5

type ImportResult struct {
	ImportedCount int                     `json:"imported_count"`
	Validation    *ImportValidationResult `json:"validation"`
	Imported      []ImportedSpammerInfo   `json:"imported"`
	Errors        []string                `json:"errors"`
	Warnings      []string                `json:"warnings"`
	Message       string                  `json:"message"`
}

ImportResult contains the results of an import operation

type ImportValidationResult added in v1.1.5

type ImportValidationResult struct {
	TotalSpammers    int                     `json:"total_spammers"`
	ValidSpammers    int                     `json:"valid_spammers"`
	Duplicates       []string                `json:"duplicates"`
	InvalidScenarios []string                `json:"invalid_scenarios"`
	Spammers         []SpammerValidationInfo `json:"spammers"`
}

ImportValidationResult contains validation results for import data

type ImportedSpammerInfo added in v1.1.5

type ImportedSpammerInfo struct {
	ID          int64  `json:"id"`
	Name        string `json:"name"`
	Scenario    string `json:"scenario"`
	Description string `json:"description"`
	Start       *bool  `json:"start,omitempty"`
}

type MetricsCollector added in v1.1.5

type MetricsCollector struct {
	// contains filtered or unexported fields
}

MetricsCollector holds all Prometheus metrics for the spamoor daemon

func (*MetricsCollector) IncrementTransactionFailures added in v1.1.5

func (mc *MetricsCollector) IncrementTransactionFailures(spammerID int64, spammerName, scenario string)

IncrementTransactionFailures increments the failed transaction counter

func (*MetricsCollector) IncrementTransactionsSent added in v1.1.5

func (mc *MetricsCollector) IncrementTransactionsSent(spammerID int64, spammerName, scenario string)

IncrementTransactionsSent increments the sent transaction counter

func (*MetricsCollector) SetSpammerRunning added in v1.1.5

func (mc *MetricsCollector) SetSpammerRunning(spammerID int64, spammerName, scenario string, running bool)

SetSpammerRunning sets the running status for a spammer

func (*MetricsCollector) UpdateBlockGasUsage added in v1.1.6

func (mc *MetricsCollector) UpdateBlockGasUsage(spammerID int64, spammerName string, blockNumber uint64, gasUsed uint64)

UpdateBlockGasUsage updates the block gas usage gauge for a spammer

func (*MetricsCollector) UpdatePendingTransactions added in v1.1.6

func (mc *MetricsCollector) UpdatePendingTransactions(spammerID int64, spammerName string, count uint64)

UpdatePendingTransactions updates the pending transactions gauge for a spammer

func (*MetricsCollector) UpdateTotalBlockGas added in v1.1.6

func (mc *MetricsCollector) UpdateTotalBlockGas(category string, gasUsed uint64)

UpdateTotalBlockGas updates the total block gas gauge with category breakdown

type MetricsUpdate added in v1.1.6

type MetricsUpdate struct {
	BlockNumber     uint64
	NewDataPoint    *BlockDataPoint
	UpdatedSpammers map[uint64]*SpammerSnapshot
	Timestamp       time.Time
}

MetricsUpdate represents a real-time update to metrics

type MultiGranularityMetrics added in v1.1.6

type MultiGranularityMetrics struct {
	// contains filtered or unexported fields
}

MultiGranularityMetrics manages time-windowed metrics with configurable block granularity

func NewMultiGranularityMetrics added in v1.1.6

func NewMultiGranularityMetrics(windowDuration time.Duration, blockGranularity uint64) *MultiGranularityMetrics

NewMultiGranularityMetrics creates a new multi-granularity metrics collector

func (*MultiGranularityMetrics) GetDataPoints added in v1.1.6

func (mgm *MultiGranularityMetrics) GetDataPoints() []BlockDataPoint

GetDataPoints returns a copy of data points for a specific window

func (*MultiGranularityMetrics) GetSpammerSnapshots added in v1.1.6

func (mgm *MultiGranularityMetrics) GetSpammerSnapshots() map[uint64]*SpammerSnapshot

GetSpammerSnapshots returns current spammer snapshots

func (*MultiGranularityMetrics) GetTimeRange added in v1.1.6

func (mgm *MultiGranularityMetrics) GetTimeRange() (time.Time, time.Time)

GetTimeRange returns the time range of data points

type Spammer

type Spammer struct {
	// contains filtered or unexported fields
}

Spammer represents a single scenario execution instance with database persistence. It manages the lifecycle of a scenario including wallet pool creation, configuration loading, and execution monitoring with panic recovery.

func (*Spammer) GetConfig

func (s *Spammer) GetConfig() string

GetConfig returns the YAML configuration string used by this spammer.

func (*Spammer) GetCreatedAt

func (s *Spammer) GetCreatedAt() int64

GetCreatedAt returns the Unix timestamp when this spammer was created.

func (*Spammer) GetDescription

func (s *Spammer) GetDescription() string

GetDescription returns the description text of the spammer instance.

func (*Spammer) GetID

func (s *Spammer) GetID() int64

GetID returns the unique identifier of the spammer instance.

func (*Spammer) GetLogScope

func (s *Spammer) GetLogScope() *logscope.LogScope

GetLogScope returns the buffered log scope for this spammer. This provides access to captured log messages for debugging and monitoring.

func (*Spammer) GetName

func (s *Spammer) GetName() string

GetName returns the human-readable name of the spammer instance.

func (*Spammer) GetScenario

func (s *Spammer) GetScenario() string

GetScenario returns the name of the scenario being executed by this spammer.

func (*Spammer) GetStatus

func (s *Spammer) GetStatus() int

GetStatus returns the current execution status of the spammer as an integer. Use SpammerStatus constants to interpret the returned value.

func (*Spammer) GetWalletPool

func (s *Spammer) GetWalletPool() *spamoor.WalletPool

GetWalletPool returns the wallet pool used by this spammer for transaction submission. Returns nil if the spammer has not been started or the wallet pool is not initialized.

func (*Spammer) Pause

func (s *Spammer) Pause() error

Pause stops the running scenario by canceling its context. It waits up to 10 seconds for the scenario to stop gracefully. Returns an error if the scenario is not running or fails to stop within the timeout.

func (*Spammer) Start

func (s *Spammer) Start() error

Start begins execution of the spammer's scenario in a separate goroutine. It updates the status to running in the database and launches the scenario runner. Returns an error if the database update fails.

func (*Spammer) TrackTransactionResult added in v1.1.5

func (s *Spammer) TrackTransactionResult(err error)

TrackTransactionResult records transaction success or failure for metrics

type SpammerBlockData added in v1.1.6

type SpammerBlockData struct {
	GasUsed          uint64 `json:"gasUsed"`
	ConfirmedTxCount uint64 `json:"confirmedTxCount"`
	PendingTxCount   uint64 `json:"pendingTxCount"`   // snapshot at end of period
	SubmittedTxCount uint64 `json:"submittedTxCount"` // total transactions submitted (lifetime)
}

SpammerBlockData represents a spammer's metrics within a data point

type SpammerConfig

type SpammerConfig struct {
	Seed           string       `yaml:"seed"`
	RefillAmount   *uint256.Int `yaml:"refill_amount"`
	RefillBalance  *uint256.Int `yaml:"refill_balance"`
	RefillInterval uint64       `yaml:"refill_interval"`
	WalletCount    int          `yaml:"wallet_count"`
}

SpammerConfig defines the wallet configuration for a spammer instance. This includes the seed for deterministic wallet generation and funding parameters.

type SpammerSnapshot added in v1.1.6

type SpammerSnapshot struct {
	SpammerID        uint64
	PendingTxCount   uint64
	TotalConfirmedTx uint64 // lifetime total
	TotalSubmittedTx uint64 // lifetime total submitted
	LastUpdate       time.Time
}

SpammerSnapshot represents current state of a spammer (not aggregated)

type SpammerStatus

type SpammerStatus int

SpammerStatus represents the execution state of a spammer instance. It tracks whether the spammer is paused, running, finished, or failed.

const (
	// SpammerStatusPaused indicates the spammer is stopped and can be resumed
	SpammerStatusPaused SpammerStatus = iota
	// SpammerStatusRunning indicates the spammer is actively executing its scenario
	SpammerStatusRunning
	// SpammerStatusFinished indicates the spammer completed its scenario successfully
	SpammerStatusFinished
	// SpammerStatusFailed indicates the spammer encountered an error and stopped
	SpammerStatusFailed
)

type SpammerValidationInfo added in v1.1.5

type SpammerValidationInfo struct {
	Name        string   `json:"name"`
	Scenario    string   `json:"scenario"`
	Description string   `json:"description"`
	Valid       bool     `json:"valid"`
	Issues      []string `json:"issues"`
}

SpammerValidationInfo contains validation info for a single spammer

type TxPoolMetricsCollector added in v1.1.6

type TxPoolMetricsCollector struct {
	// contains filtered or unexported fields
}

TxPoolMetricsCollector subscribes to TxPool block updates for advanced metrics collection

func NewTxPoolMetricsCollector added in v1.1.6

func NewTxPoolMetricsCollector(txPool *spamoor.TxPool) *TxPoolMetricsCollector

NewTxPoolMetricsCollector creates and initializes the metrics collector

func (*TxPoolMetricsCollector) GetLongWindowMetrics added in v1.1.6

func (mc *TxPoolMetricsCollector) GetLongWindowMetrics() *MultiGranularityMetrics

GetLongWindowMetrics returns the 6-hour per-32-block metrics

func (*TxPoolMetricsCollector) GetShortWindowMetrics added in v1.1.6

func (mc *TxPoolMetricsCollector) GetShortWindowMetrics() *MultiGranularityMetrics

GetShortWindowMetrics returns the 30-minute per-block metrics

func (*TxPoolMetricsCollector) Shutdown added in v1.1.6

func (mc *TxPoolMetricsCollector) Shutdown()

Shutdown stops the metrics collector

func (*TxPoolMetricsCollector) Subscribe added in v1.1.6

func (mc *TxPoolMetricsCollector) Subscribe() (uint64, <-chan *MetricsUpdate)

Subscribe creates a new subscription for real-time metrics updates

func (*TxPoolMetricsCollector) Unsubscribe added in v1.1.6

func (mc *TxPoolMetricsCollector) Unsubscribe(id uint64)

Unsubscribe removes a subscription

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL