1
0
Fork 0

improve error handling
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Massaki Archambault 2021-10-03 18:02:25 -04:00
parent 53c3a629c5
commit 3fbb87d821
3 changed files with 42 additions and 15 deletions

View File

@ -47,13 +47,6 @@ type Account struct {
Tx AccountTx Tx AccountTx
} }
type AccountTx struct {
DepositTotal int
WithdrawalTotal int
LastUpdate time.Time
UpdateLock sync.Mutex
}
func NewAccount(address string) Account { func NewAccount(address string) Account {
return Account{ return Account{
Address: address, Address: address,
@ -65,6 +58,13 @@ func NewAccount(address string) Account {
} }
} }
type AccountTx struct {
DepositTotal int
WithdrawalTotal int
LastUpdate time.Time
UpdateLock sync.Mutex
}
const ( const (
namespace = "helium" namespace = "helium"
blockchain_oracle_factor = 100000000 blockchain_oracle_factor = 100000000
@ -449,13 +449,27 @@ func (e *Exporter) collectAccountRewardsTotalMetrics(wg *sync.WaitGroup, ch chan
func (e *Exporter) collectAccountTransactionsMetrics(wg *sync.WaitGroup, ch chan<- prometheus.Metric, account *Account) { func (e *Exporter) collectAccountTransactionsMetrics(wg *sync.WaitGroup, ch chan<- prometheus.Metric, account *Account) {
defer wg.Done() defer wg.Done()
activityTypes := []string{
"add_gateway_v1",
"assert_location_v1",
"assert_location_v2",
"payment_v1",
"payment_v2",
"rewards_v1",
"rewards_v2",
"stake_validator_v1",
"token_burn_v1",
"transfer_hotspot_v1",
"unstake_validator_v1",
}
// we can only want to allow a single instance of the routine doing // we can only want to allow a single instance of the routine doing
// calculations on the deposited and widthdrawn total // calculations on the deposited and widthdrawn total
account.Tx.UpdateLock.Lock() account.Tx.UpdateLock.Lock()
defer account.Tx.UpdateLock.Unlock() defer account.Tx.UpdateLock.Unlock()
now := time.Now() now := time.Now()
activities, err := heliumapi.GetActivityForAccount(account.Address, []string{}, &account.Tx.LastUpdate, &now) activities, err := heliumapi.GetActivityForAccount(account.Address, activityTypes, &account.Tx.LastUpdate, &now)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return

View File

@ -3,6 +3,7 @@ package heliumapi
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"strings"
"time" "time"
"github.com/helium-blockchain-exporter/heliumapi/activity" "github.com/helium-blockchain-exporter/heliumapi/activity"
@ -31,7 +32,9 @@ func GetAccountForAddress(account string) (*Account, error) {
// query https://docs.helium.com/api/blockchain/accounts#activity-for-account // query https://docs.helium.com/api/blockchain/accounts#activity-for-account
func GetActivityForAccount(account string, filterTypes []string, minTime *time.Time, maxTime *time.Time) (*activity.Activities, error) { func GetActivityForAccount(account string, filterTypes []string, minTime *time.Time, maxTime *time.Time) (*activity.Activities, error) {
path := "/v1/accounts/" + account + "/activity" path := "/v1/accounts/" + account + "/activity"
params := map[string]string{} params := map[string]string{
"filter_types": strings.Join(filterTypes, ","),
}
if minTime != nil { if minTime != nil {
params["min_time"] = minTime.UTC().Format("2006-01-02T15:04:05Z") params["min_time"] = minTime.UTC().Format("2006-01-02T15:04:05Z")
} }

View File

@ -49,14 +49,19 @@ func getHeliumApi(path string, params *map[string]string) ([]byte, error) {
// query the api // query the api
resp, err := client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to query %v: %v", path, err) return nil, fmt.Errorf("failed to query %v: %v", req.URL.RequestURI(), err)
} }
defer resp.Body.Close() defer resp.Body.Close()
// validate the response status
if resp.StatusCode != 200 {
return nil, fmt.Errorf("failed to query %v: http status %v", req.URL.RequestURI(), resp.StatusCode)
}
// read the response body // read the response body
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to read response body of %v: %v", path, err) return nil, fmt.Errorf("failed to read response body of %v: %v", req.URL.RequestURI(), err)
} }
return body, nil return body, nil
@ -86,22 +91,27 @@ func getHeliumApiWithCursor(path string, params *map[string]string) ([][]byte, e
// query the api // query the api
resp, err := client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to query %v: %v", path, err) return nil, fmt.Errorf("failed to query %v: %v", req.URL.RequestURI(), err)
} }
defer resp.Body.Close() defer resp.Body.Close()
// read the response body and add it to the result array // read the response body and add it to the result array
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to read response body of %v: %v", path, err) return nil, fmt.Errorf("failed to read response body of %v: %v", req.URL.RequestURI(), err)
} }
res = append(res, body) res = append(res, body)
// validate the response status
if resp.StatusCode != 200 {
return nil, fmt.Errorf("failed to query %v: http status %v", req.URL.RequestURI(), resp.StatusCode)
}
// parse the response body for a cursor // parse the response body for a cursor
respCursor.Cursor = "" respCursor.Cursor = ""
err = json.Unmarshal(body, &respCursor) err = json.Unmarshal(body, &respCursor)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to unmarshal response from %v: %v", path, err) return nil, fmt.Errorf("failed to unmarshal response from %v: %v", req.URL.RequestURI(), err)
} }
// continue querying until there is no longer a cursor // continue querying until there is no longer a cursor
@ -109,7 +119,7 @@ func getHeliumApiWithCursor(path string, params *map[string]string) ([][]byte, e
params = &map[string]string{"cursor": respCursor.Cursor} params = &map[string]string{"cursor": respCursor.Cursor}
req, err = createGetRequest(path, *params) req, err = createGetRequest(path, *params)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create query request %v: %v", path, err) return nil, fmt.Errorf("failed to create query request %v: %v", req.URL.RequestURI(), err)
} }
} else { } else {
break break