Skip to content

Commit 20f60b6

Browse files
feat: add queries metric per chain/host (#15)
1 parent f5c398f commit 20f60b6

File tree

11 files changed

+169
-136
lines changed

11 files changed

+169
-136
lines changed

.golangci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ linters:
1717
- funlen
1818
- nlreturn
1919
- wrapcheck
20-
- gomnd
2120
- cyclop
2221
- err113
2322
- exhaustruct
@@ -42,3 +41,4 @@ linters:
4241
- mnd
4342
- goconst
4443
- execinquery
44+
- nilnil

pkg/data_fetcher/data_fetcher.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func NewDataFetcher(
3131
nodesManager *tendermint.NodeManager,
3232
) *DataFetcher {
3333
priceFetchers := map[constants.PriceFetcherName]priceFetcher.PriceFetcher{
34-
constants.PriceFetcherNameCoingecko: priceFetcher.NewCoingeckoPriceFetcher(logger),
34+
constants.PriceFetcherNameCoingecko: priceFetcher.NewCoingeckoPriceFetcher(logger, metricsManager),
3535
}
3636

3737
return &DataFetcher{

pkg/data_fetcher/denoms.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ func (f *DataFetcher) PopulateDenoms(amounts []*types.AmountWithChain) {
9292
return
9393
}
9494

95-
fetcherPrices, queryInfo, denomFetchError := foundPriceFetcher.GetPrices(notCachedDenoms)
96-
f.MetricsManager.LogQueryInfo(queryInfo)
95+
fetcherPrices, denomFetchError := foundPriceFetcher.GetPrices(notCachedDenoms)
9796

9897
if denomFetchError != nil {
9998
f.Logger.Err(denomFetchError).

pkg/http/http.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ type Client struct {
1515
chain string
1616
}
1717

18-
func NewClient(logger *zerolog.Logger, chain string) *Client {
18+
func NewClient(
19+
logger *zerolog.Logger,
20+
chain string,
21+
) *Client {
1922
return &Client{
2023
logger: logger.With().
2124
Str("component", "http").
@@ -26,6 +29,7 @@ func NewClient(logger *zerolog.Logger, chain string) *Client {
2629
}
2730

2831
func (c *Client) GetInternal(
32+
host string,
2933
url string,
3034
query string,
3135
) (io.ReadCloser, types.QueryInfo, error) {
@@ -47,11 +51,12 @@ func (c *Client) GetInternal(
4751
queryInfo := types.QueryInfo{
4852
Success: false,
4953
Chain: c.chain,
54+
Host: host,
5055
Query: query,
5156
URL: url,
5257
}
5358

54-
req, err := http.NewRequest(http.MethodGet, url, nil)
59+
req, err := http.NewRequest(http.MethodGet, host+url, nil)
5560
if err != nil {
5661
return nil, queryInfo, err
5762
}
@@ -73,10 +78,11 @@ func (c *Client) GetInternal(
7378
}
7479

7580
func (c *Client) GetPlain(
81+
host string,
7682
url string,
7783
query string,
7884
) ([]byte, types.QueryInfo, error) {
79-
body, queryInfo, err := c.GetInternal(url, query)
85+
body, queryInfo, err := c.GetInternal(host, url, query)
8086
if err != nil {
8187
return nil, queryInfo, err
8288
}
@@ -86,15 +92,18 @@ func (c *Client) GetPlain(
8692
return nil, queryInfo, err
8793
}
8894

95+
queryInfo.Success = true
96+
8997
return bytes, queryInfo, nil
9098
}
9199

92100
func (c *Client) Get(
101+
host string,
93102
url string,
94103
query string,
95104
target interface{},
96105
) (types.QueryInfo, error) {
97-
body, queryInfo, err := c.GetInternal(url, query)
106+
body, queryInfo, err := c.GetInternal(host, url, query)
98107
if err != nil {
99108
return queryInfo, err
100109
}
@@ -104,5 +113,7 @@ func (c *Client) Get(
104113
return queryInfo, jsonErr
105114
}
106115

116+
queryInfo.Success = true
117+
107118
return queryInfo, body.Close()
108119
}

pkg/http/http_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func TestHttpClientErrorCreating(t *testing.T) {
1212

1313
logger := loggerPkg.GetNopLogger()
1414
client := NewClient(logger, "chain")
15-
queryInfo, err := client.Get("://test", "query", nil)
15+
queryInfo, err := client.Get("://test", "", "query", nil)
1616
require.Error(t, err)
1717
require.False(t, queryInfo.Success)
1818
}

pkg/metrics/manager.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ func NewManager(logger *zerolog.Logger, config types.MetricsConfig) *Manager {
4444
successQueriesCounter := prometheus.NewCounterVec(prometheus.CounterOpts{
4545
Name: constants.PrometheusMetricsPrefix + "queries_successful",
4646
Help: "Counter of successful queries towards the external services.",
47-
}, []string{"chain", "query"})
47+
}, []string{"chain", "query", "host"})
4848

4949
failedQueriesCounter := prometheus.NewCounterVec(prometheus.CounterOpts{
5050
Name: constants.PrometheusMetricsPrefix + "queries_failed",
5151
Help: "Counter of failed queries towards the external services.",
52-
}, []string{"chain", "query"})
52+
}, []string{"chain", "query", "host"})
5353

5454
appVersionGauge := prometheus.NewGaugeVec(prometheus.GaugeOpts{
5555
Name: constants.PrometheusMetricsPrefix + "version",
@@ -127,11 +127,19 @@ func (m *Manager) LogAppVersion(version string) {
127127
func (m *Manager) LogQueryInfo(queryInfo types.QueryInfo) {
128128
if queryInfo.Success {
129129
m.successQueriesCounter.
130-
With(prometheus.Labels{"chain": queryInfo.Chain, "query": queryInfo.Query}).
130+
With(prometheus.Labels{
131+
"chain": queryInfo.Chain,
132+
"query": queryInfo.Query,
133+
"host": queryInfo.Host,
134+
}).
131135
Inc()
132136
} else {
133137
m.failedQueriesCounter.
134-
With(prometheus.Labels{"chain": queryInfo.Chain, "query": queryInfo.Query}).
138+
With(prometheus.Labels{
139+
"chain": queryInfo.Chain,
140+
"query": queryInfo.Query,
141+
"host": queryInfo.Host,
142+
}).
135143
Inc()
136144
}
137145
}

pkg/price_fetcher/coingecko.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"main/pkg/constants"
66
"main/pkg/http"
7+
"main/pkg/metrics"
78
"main/pkg/types"
89
"main/pkg/utils"
910
"strings"
@@ -12,39 +13,47 @@ import (
1213
)
1314

1415
type CoingeckoPriceFetcher struct {
15-
Client *http.Client
16-
Logger zerolog.Logger
16+
Client *http.Client
17+
Logger zerolog.Logger
18+
MetricsManager *metrics.Manager
1719
}
1820

19-
func NewCoingeckoPriceFetcher(logger *zerolog.Logger) *CoingeckoPriceFetcher {
21+
func NewCoingeckoPriceFetcher(
22+
logger *zerolog.Logger,
23+
metricsManager *metrics.Manager,
24+
) *CoingeckoPriceFetcher {
2025
return &CoingeckoPriceFetcher{
21-
Client: http.NewClient(logger, "coingecko"),
22-
Logger: logger.With().Str("component", "coingecko_price_fetcher").Logger(),
26+
Client: http.NewClient(logger, "coingecko"),
27+
Logger: logger.With().Str("component", "coingecko_price_fetcher").Logger(),
28+
MetricsManager: metricsManager,
2329
}
2430
}
2531

26-
func (c *CoingeckoPriceFetcher) GetPrices(denomInfos []*types.Denom) (Prices, types.QueryInfo, error) {
32+
func (c *CoingeckoPriceFetcher) GetPrices(denomInfos []*types.Denom) (Prices, error) {
2733
currenciesToFetch := utils.Map(denomInfos, func(denomInfo *types.Denom) string {
2834
return denomInfo.CoingeckoCurrency.String
2935
})
3036

3137
var coingeckoResponse map[string]map[string]float64
32-
query, err := c.Client.Get(
38+
queryInfo, err := c.Client.Get(
39+
"https://api.coingecko.com",
3340
fmt.Sprintf(
34-
"https://api.coingecko.com/api/v3/simple/price?ids=%s&vs_currencies=%s",
41+
"/api/v3/simple/price?ids=%s&vs_currencies=%s",
3542
strings.Join(currenciesToFetch, ","),
3643
constants.CoingeckoBaseCurrency,
3744
),
3845
"fetch_prices",
3946
&coingeckoResponse,
4047
)
4148

49+
c.MetricsManager.LogQueryInfo(queryInfo)
50+
4251
if err != nil {
4352
c.Logger.Error().
4453
Err(err).
4554
Strs("currencies", currenciesToFetch).
4655
Msg("Could not get rates, probably rate-limiting")
47-
return map[string]map[string]float64{}, query, err
56+
return map[string]map[string]float64{}, err
4857
}
4958

5059
result := make(map[string]map[string]float64)
@@ -64,7 +73,7 @@ func (c *CoingeckoPriceFetcher) GetPrices(denomInfos []*types.Denom) (Prices, ty
6473
}
6574
}
6675

67-
return result, query, nil
76+
return result, nil
6877
}
6978

7079
func (c *CoingeckoPriceFetcher) Name() string {

pkg/price_fetcher/price_fetcher.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ func (p *Prices) Get(chain string, denom string) (float64, bool) {
2323
}
2424

2525
type PriceFetcher interface {
26-
GetPrices(denomInfos []*types.Denom) (Prices, types.QueryInfo, error)
26+
GetPrices(denomInfos []*types.Denom) (Prices, error)
2727
Name() string
2828
}

0 commit comments

Comments
 (0)