---
# System prepended metadata

title: Loki to Prom Migration

---

# Loki to Prom Migration

## I. Javascript syntax:

### 1. Template literal interpolation

#### Example
```javascript
  `${myVar}`
  `${someMethod()}`
  `${a + b + c}`
```
#### Usage
- interpolates 'myVar' the variable
- interpolates the result of a given expression (i.e., the return of `someMethod()` or `a + b + c`)

### 2. Ternary operators

#### Example
```javascript
  myVar >= 1 ? 'return_if_true' : 'return_if_false'
```
#### Usage
  - returns the left value if expression evalues to true, and the right expression if evaluates to false

### 3. Optional chaining

#### Example
```javascript
  a?.b?.c
```
#### Usage
  - if object a exists then get value b of a, if b exist, then get value c of b, otherwise return null

### 4. Nullish coalescing operator

#### Example
```javascript
  value ?? 1
```
#### Usage
  - returns value if value is not null/undefined, otherwise return 1

## II. Defaults

- BASE_URL: `/v1/metrics/api/v1`
- Method: `GET`

## III. Requests

#### 1. /label/__name__/values

Location: `/src/components/features/metrics/metricsApi/MetricsApi.component.jsx::50`

#### 2. /query?params=

Location: `/src/components/features/feedDetails/metrics/AverageResponseTimeBarChart.jsx::11`

```javascript
  {
    query: `
      avg(avg_over_time(feeds_response_latency{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${feed.network.id}|"}[${
        days >= 1 ? days + 'd' : hours + 'h'
      }])) by (oracle_name, oracle_address)
    `,
    time: dateQuery.end
  }
```

#### 3. /query?params=

- Location: `/src/components/features/feedDetails/head/AnswerChart.component.jsx::30`

```javascript
  {
    query: `
      avg(feeds_latest_answer{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${feed.networkId}|"}) by (feed_address) / ${
        feed?.meta?.multiply ?? 1
      }
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 4. /query?params=

Location: `/src/components/features/feedDetails/metrics/AnswerChart.jsx::20`

```javascript
  {
    query: `
      avg(feeds_latest_answer{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${feed.network.id}|"}) by (feed_address) / ${
        feed?.meta?.multiply ?? 1
      }
    `
  }
```

#### 5. /query_range?params=

Location: `/src/components/features/metrics/metricsApi/MetricsApi.component.jsx::20`

```javascript
  {
    query: `
      sum(increase(feeds_new_rounds{network_id="1"}[1d])) by (feed_address, feed_name) OR sum(increase(feeds_new_transmissions{network_id="1"}[1d])) by (feed_address, feed_name)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 6. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::42`

```javascript
  {
    query: `
      count(max_over_time(timestamp(delta(feeds_latest_answer{network_id="${network.id}"}[3m]) != 0)[1d:1m]))
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 7. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::63`

```javascript
  {
    query: `
      sum(increase(feeds_new_rounds{network_id="${network.id}"}[1d])) OR sum(increase(feeds_new_transmissions{network_id="${network.id}"}[1d]))
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 8. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::86`

```javascript
  {
    query: `
      sum(sum(increase(feeds_new_rounds{network_id="${network.id}"}[1d])) by (feed_name, feed_address) * count(feeds_response{network_id="${network.id}"}) by (feed_name, feed_address)) + sum(increase(feeds_new_rounds{network_id="${network.id}"}[1d]))
      OR
      sum(sum(increase(feeds_new_transmissions{network_id="${network.id}"}[1d])) by (feed_name, feed_address) * count(feeds_response{network_id="${network.id}"}) by (feed_name, feed_address)) + sum(increase(feeds_new_transmissions{network_id="${network.id}"}[1d]))
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 9. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::112`

```javascript
  {
    query: `
      feeds_response_gas_price_average{network_id="${network.id}"} / 1000000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 10. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::134`

```javascript
  {
    query: `
      sum(
        sum(increase(feeds_response_count{network_id="${network.id}"}[1d])) by (oracle_name, oracle_address, feed_type) *
        avg(feeds_response_gas_consumed{network_id="${network.id}"}) by (oracle_name, oracle_address, feed_type) *
        (avg(feeds_response_gas_price) by (oracle_name, oracle_address, feed_type) / 10 ^ 18)
      )
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 11. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::156`

```javascript
  {
    query: `
      topk(1, sum(increase(feeds_new_rounds{network_id="${network.id}"}[1d])) by (feed_name, feed_address) + sum(increase(feeds_response_count{network_id="${network.id}"}[1d])) by (feed_name, feed_address))
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 12. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::187`

```javascript
  {
    query: `
      max(increase(feeds_link_spent_total{network_id="${network.id}"}[${defaults.days}d])) / 10 ^ 18
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 13. /query_range?params=

Location: `/src/state/ducks/metric/operations.js::346`

```javascript
  {
    query: `
      feeds_latest_answer{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${networkId}"}
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (endDate.unix() - startDate.unix()) / 60,
    days: endDate.diff(startDate, 'days')
  }
```

#### 14. /query?params=

Location: `/src/state/ducks/metric/operations.js::194`

```javascript
  {
    query: `
      max(feeds_latest_answer{feed_id="bdec936d-7bd3-4ce6-8b20-d9dfb18ea1aa",network_id="1"}) / 10 ^ 8
    `,
  }
```

#### 15. /query?params=

Location: `/src/state/ducks/metric/operations.js::240`

```javascript
  {
    query: /* see switch example below*/,
  }
```

```javascript
  switch (type) {
    case 'Transactions':
      return `topk(10, sum(increase(feeds_new_rounds{network_id="${networkId}"}[${defaults.days}d])) by (feed_name, feed_address) + sum(increase(feeds_response_count{network_id="${networkId}"}[${defaults.days}d])) by (feed_name, feed_address))`
    case 'Link Balance':
      return `topk(10, max_over_time(feeds_link_balance{network_id="${networkId}"}[${defaults.days}d])) / 10 ^ 18`
    case 'LINK Earned':
      return `topk(10, sum(increase(feeds_link_earned{network_id="${networkId}"}[${defaults.days}d])) by (feed_address, feed_name)) / 10 ^ 18`
    case 'Volatility':
      return `topk(10, max(max_over_time(feeds_response_deviation{network_id="${networkId}"}[${defaults.days}d])) by (feed_name, feed_address)) `

    default:
      return `topk(10, max_over_time(feeds_updated_answer_count{network_id="${networkId}"}[${defaults.days}d]))`
  }
```

#### 16. /query?params=

Location: `/src/state/ducks/metric/operations.js::279`

```javascript
  {
    query: `
      bottomk(20, time() - max_over_time(timestamp(delta(feeds_new_rounds{network_id="${networkId}"}[3m]) != 0)[2h:1m]) OR
      time() - max_over_time(timestamp(delta(feeds_new_transmissions{network_id="${networkId}"}[3m]) != 0)[2h:1m]))
    `,
  }
```

#### 17. /query?params=

Location: `/src/state/ducks/metric/operations.js::325`

```javascript
  {
    query: ` 
      feeds_latest_answer{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${networkId}}
    `,
  }
```

#### 18. /query?params=

Location: `/src/state/ducks/metric/operations.js::332`

```javascript
  {
    query: `
      feeds_latest_answer{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${networkId}"} offset ${offset - (offset % 60)}s
    `,
  }
```

#### 19. /query?params=

Location: `/src/state/ducks/metric/operations.js::361`

```javascript
  {
    query: `
      bottomk(1, feeds_response_latency{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${networkId}} != 0 and feeds_individual_time_out == 0)
    `,
  }
```

#### 20. /query?params=

Location: `/src/state/ducks/metric/operations.js::371`

```javascript
  {
    query: `
      bottomk(1, feeds_response_latency{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${networkId}"} offset ${offset - (offset % 60)}s != 0 and feeds_individual_time_out offset ${offset - (offset % 60)}s == 0) 
    `,
  }
```

#### 21. /query?params=

Location: `/src/state/ducks/metric/operations.js::390`

```javascript
  {
    query: `
      topk(1, increase(feeds_eth_spent{feed_type="OFFCHAIN_AGGREGATOR",feed_address=~"(?i)${queryOptions.feed_address}"}[10m]))
    `,
  }
```

#### 22. /query?params=

Location: `/src/state/ducks/metric/operations.js::400`

```javascript
  {
    query: `
      topk(1, increase(feeds_eth_spent{feed_type="OFFCHAIN_AGGREGATOR",feed_address=~"(?i)${queryOptions.feed_address}"} offset ${offset - (offset % 60)}s[10m]))
    `,
  }
```

#### 23. /query?params=

Location: `/src/state/ducks/metric/operations.js::419`

```javascript
  {
    query: `
      avg(feeds_response_gas_price_per_feed{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${network.id}"}) / 10 ^ 9
    `,
  }
```

#### 24. /query?params=

Location: `/src/state/ducks/metric/operations.js::426`

```javascript
  {
    query: `
      avg(feeds_response_gas_price_per_feed{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${network.id}"} offset ${offset - (offset % 60)}s) / 10 ^ 9
    `,
  }
```

#### 25. /query?params=

Location: `/src/state/ducks/metric/operations.js::447`

```javascript
  {
    query: `
      sum(increase(feeds_eth_spent_per_feed{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${network.id}"}[${offset + 240 - (offset % 60)}s]) / 10 ^ 18) * max(feeds_latest_answer{network_id="1", feed_id="80896ae7-2058-46cf-9384-e1efefe60f23"} / 10 ^ 8)
    `,
  }
```

#### 26. /query?params=

Location: `/src/state/ducks/metric/operations.js::455`

```javascript
  {
    query: `
      sum(increase(feeds_eth_spent_per_feed{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${network.id}"} [${offset + 240 - (offset % 60)}s])) / 10 ^ 18
    `,
  }
```

#### 27. /query?params=

Location: `/src/state/ducks/metric/operations.js::483`

```javascript
  {
    query: `
      (sum(increase(feeds_link_earned{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${networkId}"}[${offset + 240 - (offset % 60)}s])) / 10 ^ 18) * avg(feeds_latest_answer{network_id="1", feed_id="bdec936d-7bd3-4ce6-8b20-d9dfb18ea1aa"} / 10 ^ 8)
    `,
  }
```

#### 28. /query?params=

Location: `/src/state/ducks/metric/operations.js::491`

```javascript
  {
    query: `
      sum(increase(feeds_link_earned{feed_address=~"(?i)${queryOptions.feed_address}", network_id="${networkId}"}[${offset + 240 - (offset % 60)}s])) / 10 ^ 18
    `,
  }
```

#### 29. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/RevenueChart.jsx::42`

Note: I've included the business logic for how start, end and step are calculated, but for the purpose of migration, you could likely use any unix timestamp for start/end and any number (such as 3600) for step/hours, and any number for days (such as 7)

```javascript
  {
    query: `
      (sum(increase(feeds_link_earned{oracle_name="${
        node.name
      }", network_id="${node.network.id}"}[${
        perDay ? '1d' : '1h'
      }])) / 10 ^ 18) * (min(feeds_latest_answer{feed_id="bdec936d-7bd3-4ce6-8b20-d9dfb18ea1aa",network_id="1"}) / 10 ^ 8)
    `,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours')
    start: perDay ? dateQuery.start + 86400 : dateQuery.start,
    end:
      perDay && moment().unix() - dateQuery.end > 43200
        ? dateQuery.end + 86400
        : dateQuery.end,
    step: perDay ? 86400 * Math.ceil(dateQuery.days / 60) : 3600,
  }
```


#### 30. /query_range?params=

Location: `/src/components/common/models/node/Metrics.component.jsx::46`

Note: the second object below (containing cancelToken) represents "options" which is passed in the GET request OPTIONS (not as a query parameter)

```javascript
  {
    query: `
      avg(feeds_response_latency{oracle_address=~"(?i)${node.oracleAddress}", network_id="${node.network.id}"} != 0) by (oracle_address, oracle_name)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
  },
  {
    cancelToken: signal.current.token
  }
```

#### 31. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/AnswerChart.jsx::31`

```javascript
  {
    query: `
      avg(feeds_latest_answer{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${feed.network.id}|"}) by (feed_address) / ${
        feed?.meta?.multiply ?? 1
      }
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 32. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/DeviationChart.jsx::26`

Variables
```typescript
  type aggregator = 'avg' | 'min' | 'max'
```

```javascript
  {
    query: `
      ${aggregator}(feeds_response_deviation{feed_address=~"(?i)${feed.contractAddress}", network_id=~"${feed.network.id}|"}) by (feed_address)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 33. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/ExpenseChart.jsx::44`

```javascript
  {
    query: `
      sum(increase(feeds_eth_spent_per_feed{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id="${feed.network.id}"}[${perDay ? '1d' : '1h'}])) / 10 ^ 18
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 34. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/ExpenseChart.jsx::48`

```javascript
  {
    query: `
      min(feeds_latest_answer{feed_id="bdec936d-7bd3-4ce6-8b20-d9dfb18ea1aa",network_id="1"}) / 100000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 35. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/IndividualAnswerChart.jsx::24`

```javascript
  {
    query: `
      avg(feeds_response{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${
        feed.network.id
      }|"}) by (oracle_name, oracle_address) / ${feed?.meta?.multiply ?? 1}
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 36. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/LINKEarnedChart.jsx::61`

```javascript
  {
    query: `
      sum(increase(feeds_link_earned{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${feed.network.id}|"}[${
        perDay ? '1d' : '1h'
      }])) by (feed_address) / 1000000000000000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 37. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/LINKEarnedChart.jsx::65`

```javascript
  {
    query: `
      sum(increase(feeds_new_rounds{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${feed.network.id}|"}[${
        perDay ? '1d' : '1h'
      }])) by (feed_address)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 38. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/LINKEarnedChart.jsx::65`

```javascript
  {
    query: `
      sum(increase(feeds_new_transmissions{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id=~"${feed.network.id}|"}[${
        perDay ? '1d' : '1h'
      }])) by (feed_address)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 39. /query_range?params=

Location: `/src/components/features/feedDetails/metrics/RevenueChart.jsx::32`

```javascript
  {
    query: `
      (sum(increase(feeds_link_earned{feed_address=~"(?i)${
        feed.contractAddress
      }", network_id="${feed.network.id}"}[${
        perDay ? '1d' : '1h'
      }])) / 10 ^ 18) * (min(feeds_latest_answer{feed_id="bdec936d-7bd3-4ce6-8b20-d9dfb18ea1aa", network_id="1"}) / 10 ^ 8)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 40. /query_range?params=

Location: `/src/components/features/home/feedMetrics/MetricCard.component.jsx::32`

```javascript
  {
    query: `
      sum(increase(feeds_new_rounds{network_id="${network.id}"}[1d]))
      OR 
      sum(increase(feeds_new_transmissions{network_id="${network.id}"}[1d]))
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
  }
```

#### 41. /query_range?params=

Location: `/src/components/features/home/feedMetrics/MetricCard.component.jsx::32`

```javascript
  {
    query: `
      avg(
        (feeds_latest_answer{network_id="${network.id}"} / feeds_latest_answer{network_id="${network.id}"} offset 24h - 1 > 0 and feeds_latest_answer{network_id="${network.id}"} / feeds_latest_answer{network_id="${network.id}"} offset 24h - 1 < +Inf) or
        ((feeds_latest_answer{network_id="${network.id}"} / feeds_latest_answer{network_id="${network.id}"} offset 24h - 1 < 0 and feeds_latest_answer{network_id="${network.id}"} / feeds_latest_answer{network_id="${network.id}"} offset 24h - 1 > -Inf) * -1)
      ) * 100
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
  }
```

#### 42. /query_range?params=

Location: `/src/components/features/home/feedMetrics/MetricCard.component.jsx::32`

```javascript
  {
    query: `
      feeds_response_gas_price_average{network_id="${network.id}"} / 1000000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
  }
```

#### 43. /query_range?params=

Location: `/src/components/features/home/feedMetrics/NetworkOverviewChart.component.jsx::15`

```javascript
  {
    query: `
      sum(increase(feeds_link_earned{network_id="${networkId}"}[1d])) / 1000000000000000000
    `,
    start: moment().subtract(15, 'days').unix(),
    end: moment().unix(),
    step: 86400,
    days: 7

  }
```

#### 44. /query_range?params=

Location: `/src/components/features/home/feedMetrics/NetworkOverviewChart.component.jsx::27`

```javascript
  {
    query: `
      sum(increase(feeds_response_count{network_id="${networkId}"}[1d]))
    `,
    start: moment().subtract(15, 'days').unix(),
    end: moment().unix(),
    step: 86400,
    days: 7
  }
```

#### 45. /query_range?params=

Location: `/src/components/features/metrics/metricsApi/MetricsApi.component.jsx::80`

```javascript
  {
    query: `
      sum(increase(feeds_new_rounds{network_id="1"}[1d])) by (feed_address, feed_name) OR sum(increase(feeds_new_transmissions{network_id="1"}[1d])) by (feed_address, feed_name)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 46. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/DeviationChart.jsx::41`

```javascript
  {
    query: `
      feeds_response_deviation_average{network_id="${networkId}"}
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 47. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/DeviationChart.jsx::49`

```javascript
  {
    query: `
      avg(feeds_response_deviation{oracle_address=~"(?i)${node.oracleAddress}", network_id="${networkId}"}) by (oracle_address, oracle_name)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 48. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/ExpenseChart.jsx::64`

```javascript
  {
    query: `
      sum(increase(feeds_eth_spent{network_id="${
        node.network.id
      }",oracle_name="${node.name}"}[${
        perDay ? '1d' : '1h'
      }])) by (oracle_name, oracle_address) / 10 ^ 18
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
```

#### 49. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/ExpenseChart.jsx::74`

```javascript
  {
    query: `
      min(feeds_latest_answer{feed_id="bdec936d-7bd3-4ce6-8b20-d9dfb18ea1aa"}) / 100000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
```

#### 50. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/GasPriceChart.jsx::32`

```javascript
  {
    query: `
      avg(feeds_response_gas_price{oracle_address=~"(?i)${node.oracleAddress}", network_id="${networkId}"}) by (oracle_address, oracle_name) / 1000000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 51. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/GasPriceChart.jsx::41`

```javascript
  {
    query: `
      feeds_response_gas_price_average{network_id="${networkId}"} / 1000000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 52. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/LINKEarnedChart.jsx::95`

```javascript
  {
    query: `
      sum(increase(feeds_link_earned{oracle_address=~"(?i)${
        node.oracleAddress
      }", network_id="${node.network.id}"}[${
        perDay ? '1d' : '1h'
      }])) by (feed_address) / 1000000000000000000
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 53. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/RateOfFeedResponsesChart.jsx::35`

```javascript
  {
    query: `
      sum(increase(feeds_response_count{oracle_name="${
      node.name
    }", network_id="${node.network.id}"}[${perDay ? '1d' : '1h'}]))
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 54. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/ResponseLatencyChart.jsx::32`

```javascript
  {
    query: `
      avg(feeds_response_latency{oracle_address=~"(?i)${node.oracleAddress}", network_id="${networkId}"} != 0) by (oracle_address, oracle_name)
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 55. /query_range?params=

Location: `/src/components/features/nodeDetails/metrics/ResponseLatencyChart.jsx::41`

```javascript
  {
    query: `
      feeds_response_latency_average{network_id="${networkId}"}
    `,
    start: startDate.unix(),
    end: endDate.unix(),
    step: (end - start) / steps,
    days: endDate.diff(startDate, 'days'),
    hours: endDate.diff(startDate, 'hours'),
  }
```

#### 56. /

Location: `/src/components/features/metrics/metricsApi/MetricsApi.component.jsx::93`

Note: This example is a little different in that we are building the full URL string dynamically as opposed to relying on something like axios to do this for us with an object. We need to rewrite the following URL to be in the expected format of Loki.


```javascript
  const query = 'sum(increase(feeds_new_rounds{network_id="1"}[1d])) by (feed_address, feed_name) OR sum(increase(feeds_new_transmissions{network_id="1"}[1d])) by (feed_address, feed_name)'

  const formattedQuery = encodeURIComponent(query)

  const url = `${window.location.origin}/v1/metrics/api/v1/query_range?query=${formattedQuery}&start=${dateQuery.start}&end=${dateQuery.end}&step=${dateQuery.step}&days=${dateQuery.days}`

```

#### 57. /

Location: `/src/components/features/metrics/metricsApi/MetricsApi.component.jsx::95`

Note: This example is a little different in that we are building the full URL string dynamically as opposed to relying on something like axios to do this for us with an object. We need to rewrite the following URL to be in the expected format of Loki.


```javascript
  const query = 'sum(increase(feeds_new_rounds{network_id="1"}[1d])) by (feed_address, feed_name) OR sum(increase(feeds_new_transmissions{network_id="1"}[1d])) by (feed_address, feed_name)'

  const formattedQuery = encodeURIComponent(query)

  const curl = `curl -X GET -G "${window.location.origin}/v1/metrics/api/v1/query_range" -d
 'query=${formattedQuery}' -d start=${dateQuery.start} -d
 end=${dateQuery.end} -d step=${dateQuery.step} | jq`

```