replaced klog -> zap in rpc
This commit is contained in:
parent
a3261dd821
commit
1bbaa29acb
2
go.mod
2
go.mod
|
@ -18,6 +18,8 @@ require (
|
||||||
github.com/prometheus/client_model v0.5.0 // indirect
|
github.com/prometheus/client_model v0.5.0 // indirect
|
||||||
github.com/prometheus/common v0.48.0 // indirect
|
github.com/prometheus/common v0.48.0 // indirect
|
||||||
github.com/prometheus/procfs v0.12.0 // indirect
|
github.com/prometheus/procfs v0.12.0 // indirect
|
||||||
|
go.uber.org/multierr v1.10.0 // indirect
|
||||||
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
golang.org/x/sys v0.17.0 // indirect
|
golang.org/x/sys v0.17.0 // indirect
|
||||||
google.golang.org/protobuf v1.33.0 // indirect
|
google.golang.org/protobuf v1.33.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -27,6 +27,10 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR
|
||||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
|
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
|
||||||
|
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||||
|
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
||||||
|
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
||||||
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
|
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
|
||||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
||||||
|
|
|
@ -5,8 +5,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/asymmetric-research/solana_exporter/pkg/slog"
|
||||||
|
"go.uber.org/zap"
|
||||||
"io"
|
"io"
|
||||||
"k8s.io/klog/v2"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"slices"
|
"slices"
|
||||||
"time"
|
"time"
|
||||||
|
@ -17,6 +18,7 @@ type (
|
||||||
HttpClient http.Client
|
HttpClient http.Client
|
||||||
RpcUrl string
|
RpcUrl string
|
||||||
HttpTimeout time.Duration
|
HttpTimeout time.Duration
|
||||||
|
logger *zap.SugaredLogger
|
||||||
}
|
}
|
||||||
|
|
||||||
rpcRequest struct {
|
rpcRequest struct {
|
||||||
|
@ -99,26 +101,27 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewRPCClient(rpcAddr string, httpTimeout time.Duration) *Client {
|
func NewRPCClient(rpcAddr string, httpTimeout time.Duration) *Client {
|
||||||
return &Client{HttpClient: http.Client{}, RpcUrl: rpcAddr, HttpTimeout: httpTimeout}
|
return &Client{HttpClient: http.Client{}, RpcUrl: rpcAddr, HttpTimeout: httpTimeout, logger: slog.Get()}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getResponse[T any](
|
func getResponse[T any](
|
||||||
ctx context.Context, client *Client, method string, params []any, rpcResponse *response[T],
|
ctx context.Context, client *Client, method string, params []any, rpcResponse *response[T],
|
||||||
) error {
|
) error {
|
||||||
|
logger := slog.Get()
|
||||||
// format request:
|
// format request:
|
||||||
request := &rpcRequest{Version: "2.0", ID: 1, Method: method, Params: params}
|
request := &rpcRequest{Version: "2.0", ID: 1, Method: method, Params: params}
|
||||||
buffer, err := json.Marshal(request)
|
buffer, err := json.Marshal(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Fatalf("failed to marshal request: %v", err)
|
logger.Fatalf("failed to marshal request: %v", err)
|
||||||
}
|
}
|
||||||
klog.V(2).Infof("jsonrpc request: %s", string(buffer))
|
logger.Debugf("jsonrpc request: %s", string(buffer))
|
||||||
|
|
||||||
// make request:
|
// make request:
|
||||||
ctx, cancel := context.WithTimeout(ctx, client.HttpTimeout)
|
ctx, cancel := context.WithTimeout(ctx, client.HttpTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
req, err := http.NewRequestWithContext(ctx, "POST", client.RpcUrl, bytes.NewBuffer(buffer))
|
req, err := http.NewRequestWithContext(ctx, "POST", client.RpcUrl, bytes.NewBuffer(buffer))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Fatalf("failed to create request: %v", err)
|
logger.Fatalf("failed to create request: %v", err)
|
||||||
}
|
}
|
||||||
req.Header.Set("content-type", "application/json")
|
req.Header.Set("content-type", "application/json")
|
||||||
|
|
||||||
|
@ -134,7 +137,7 @@ func getResponse[T any](
|
||||||
return fmt.Errorf("error processing %s rpc call: %w", method, err)
|
return fmt.Errorf("error processing %s rpc call: %w", method, err)
|
||||||
}
|
}
|
||||||
// log response:
|
// log response:
|
||||||
klog.V(2).Infof("%s response: %v", method, string(body))
|
logger.Debugf("%s response: %v", method, string(body))
|
||||||
|
|
||||||
// unmarshal the response into the predicted format
|
// unmarshal the response into the predicted format
|
||||||
if err = json.Unmarshal(body, rpcResponse); err != nil {
|
if err = json.Unmarshal(body, rpcResponse); err != nil {
|
||||||
|
@ -207,7 +210,7 @@ func (c *Client) GetBlockProduction(
|
||||||
) (*BlockProduction, error) {
|
) (*BlockProduction, error) {
|
||||||
// can't provide a last slot without a first:
|
// can't provide a last slot without a first:
|
||||||
if firstSlot == nil && lastSlot != nil {
|
if firstSlot == nil && lastSlot != nil {
|
||||||
klog.Fatalf("can't provide a last slot without a first!")
|
c.logger.Fatalf("can't provide a last slot without a first!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// format params:
|
// format params:
|
||||||
|
@ -221,7 +224,7 @@ func (c *Client) GetBlockProduction(
|
||||||
// make sure first and last slot are in order:
|
// make sure first and last slot are in order:
|
||||||
if *firstSlot > *lastSlot {
|
if *firstSlot > *lastSlot {
|
||||||
err := fmt.Errorf("last slot %v is greater than first slot %v", *lastSlot, *firstSlot)
|
err := fmt.Errorf("last slot %v is greater than first slot %v", *lastSlot, *firstSlot)
|
||||||
klog.Fatalf("%v", err)
|
c.logger.Fatalf("%v", err)
|
||||||
}
|
}
|
||||||
blockRange["lastSlot"] = *lastSlot
|
blockRange["lastSlot"] = *lastSlot
|
||||||
}
|
}
|
||||||
|
@ -286,13 +289,13 @@ func (c *Client) GetBlock(
|
||||||
) (*Block, error) {
|
) (*Block, error) {
|
||||||
detailsOptions := []string{"full", "accounts", "none"}
|
detailsOptions := []string{"full", "accounts", "none"}
|
||||||
if !slices.Contains(detailsOptions, transactionDetails) {
|
if !slices.Contains(detailsOptions, transactionDetails) {
|
||||||
klog.Fatalf(
|
c.logger.Fatalf(
|
||||||
"%s is not a valid transaction-details option, must be one of %v", transactionDetails, detailsOptions,
|
"%s is not a valid transaction-details option, must be one of %v", transactionDetails, detailsOptions,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if commitment == CommitmentProcessed {
|
if commitment == CommitmentProcessed {
|
||||||
// as per https://solana.com/docs/rpc/http/getblock
|
// as per https://solana.com/docs/rpc/http/getblock
|
||||||
klog.Fatalf("commitment '%v' is not supported for GetBlock", CommitmentProcessed)
|
c.logger.Fatalf("commitment '%v' is not supported for GetBlock", CommitmentProcessed)
|
||||||
}
|
}
|
||||||
config := map[string]any{
|
config := map[string]any{
|
||||||
"commitment": commitment,
|
"commitment": commitment,
|
||||||
|
@ -329,7 +332,7 @@ func (c *Client) GetIdentity(ctx context.Context) (string, error) {
|
||||||
return resp.Result.Identity, nil
|
return resp.Result.Identity, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MinimumLedgerSlot returns the lowest slot that the node has information about in its ledger.
|
// GetMinimumLedgerSlot returns the lowest slot that the node has information about in its ledger.
|
||||||
// See API docs: https://solana.com/docs/rpc/http/minimumledgerslot
|
// See API docs: https://solana.com/docs/rpc/http/minimumledgerslot
|
||||||
func (c *Client) GetMinimumLedgerSlot(ctx context.Context) (*int64, error) {
|
func (c *Client) GetMinimumLedgerSlot(ctx context.Context) (*int64, error) {
|
||||||
var resp response[int64]
|
var resp response[int64]
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package slog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.uber.org/zap"
|
||||||
|
)
|
||||||
|
|
||||||
|
var log *zap.SugaredLogger
|
||||||
|
|
||||||
|
// Init initializes the logger
|
||||||
|
func Init() {
|
||||||
|
logger, _ := zap.NewProduction()
|
||||||
|
log = logger.Sugar()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the global logger instance
|
||||||
|
func Get() *zap.SugaredLogger {
|
||||||
|
return log
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sync flushes any buffered log entries
|
||||||
|
func Sync() error {
|
||||||
|
return log.Sync()
|
||||||
|
}
|
Loading…
Reference in New Issue