From 91a50c9c668bcab98aaab8a719bb27be28d7a9c2 Mon Sep 17 00:00:00 2001
From: David Hintermann <David.Hintermann@ost.ch>
Date: Mon, 2 Dec 2024 11:11:25 +0000
Subject: [PATCH] wip: updated metrics

---
 .../BackgroundServices/PrometheusService.cs   |  4 +-
 Frontend/Metrics/RebalancerMetrics.cs         | 20 +++++
 Frontend/Program.cs                           |  1 +
 Frontend/Rebalancer.cs                        | 20 +++--
 grafana/dashboards/totalSupply.json           | 81 +++++++++++++++++++
 5 files changed, 120 insertions(+), 6 deletions(-)
 create mode 100644 Frontend/Metrics/RebalancerMetrics.cs

diff --git a/Frontend/BackgroundServices/PrometheusService.cs b/Frontend/BackgroundServices/PrometheusService.cs
index 677f6dd..2dd0336 100644
--- a/Frontend/BackgroundServices/PrometheusService.cs
+++ b/Frontend/BackgroundServices/PrometheusService.cs
@@ -25,7 +25,8 @@ public class PrometheusService : BackgroundService
         Web3 web3,
         Account account,
         PotatoStorageMetrics potatoStorageMetrics,
-        PotatoMarketplaceMetrics potatoMarketplaceMetrics
+        PotatoMarketplaceMetrics potatoMarketplaceMetrics,
+        RebalancerMetrics rebalancerMetrics
     )
     {
         _logger = logger;
@@ -43,6 +44,7 @@ public class PrometheusService : BackgroundService
         potatoMarketplaceMetrics.CreateMetrics();
         PoolV3Client poolClient = new(web3, chainSettings, account);
         _poolMetrics.CreateMetrics(poolClient);
+        rebalancerMetrics.CreateMetrics();
     }
 
     protected async override Task ExecuteAsync(CancellationToken stoppingToken)
diff --git a/Frontend/Metrics/RebalancerMetrics.cs b/Frontend/Metrics/RebalancerMetrics.cs
new file mode 100644
index 0000000..aa8976d
--- /dev/null
+++ b/Frontend/Metrics/RebalancerMetrics.cs
@@ -0,0 +1,20 @@
+using System.Diagnostics.Metrics;
+using Frontend.Marketplaces.Interfaces;
+
+namespace Frontend.Metrics;
+
+public class RebalancerMetrics(
+    Rebalancer rebalancer,
+    IMeterFactory meterFactory
+){
+    private readonly Rebalancer rebalancer = rebalancer;
+    private readonly IMeterFactory MeterFactory = meterFactory;
+
+    public void CreateMetrics()
+    {
+        var meter = MeterFactory.Create("RoestiCoin");
+        meter.CreateObservableGauge("Rebalancer.TradeExecutedCount", () => (int)rebalancer.RebalanceTradeExecutedCount, unit: "count");
+        meter.CreateObservableGauge("Rebalancer.Reserves.ROC", () => (double)rebalancer.Token0Reserve().Result, unit: "ROC");
+        meter.CreateObservableGauge("Rebalancer.Reserves.ETH", () => (double)rebalancer.Token1Reserve().Result, unit: "ETH");
+    }
+}
\ No newline at end of file
diff --git a/Frontend/Program.cs b/Frontend/Program.cs
index 2699c93..7dbadc8 100644
--- a/Frontend/Program.cs
+++ b/Frontend/Program.cs
@@ -43,6 +43,7 @@ builder.Services.AddHostedService<PrometheusService>();
 builder.Services.AddSingleton<Erc20TokenMetrics>();
 builder.Services.AddSingleton<PotatoStorageMetrics>();
 builder.Services.AddSingleton<PotatoMarketplaceMetrics>();
+builder.Services.AddSingleton<RebalancerMetrics>();
 
 Account account = new Account(
     accountPrivateKey,
diff --git a/Frontend/Rebalancer.cs b/Frontend/Rebalancer.cs
index 751afc0..2f57019 100644
--- a/Frontend/Rebalancer.cs
+++ b/Frontend/Rebalancer.cs
@@ -51,6 +51,7 @@ public class Rebalancer
         _potatoStorage = potatoStorage;
     }
 
+    
 
     public async Task<decimal> GetPoolPriceAsync()
     {
@@ -85,11 +86,10 @@ public class Rebalancer
 
     public async Task MaintainLiquidReservesAsync()
     {
-        var token0WeiReserve = await _token0Client.BalanceOf(_account.Address);
-        var token1WeiReserve = await _token1Client.BalanceOf(_account.Address);
+        var token0Reserve = await Token0Reserve();
         var meanPoolPrice = await GetPoolPriceAsync();
-        var token0ReservesInToken1 = Web3.Convert.FromWei(token0WeiReserve) * meanPoolPrice;
-        var token1Reserve = Web3.Convert.FromWei(token1WeiReserve);
+        var token0ReservesInToken1 = token0Reserve * meanPoolPrice;
+        var token1Reserve = await Token1Reserve();
         if (token0ReservesInToken1 / token1Reserve > 2) // token0 is ROC , token1 is WETH, our reserves in ROC are twice as big as in WETH
         {
             _logger.LogDebug("Must rebalance reserves: Token0 reserves {}(expressed in token1), Token1 reserves {}(expressed in token1)", token0ReservesInToken1, token1Reserve);
@@ -129,7 +129,7 @@ public class Rebalancer
     {
         var rwaSupply = (decimal)_potatoStorage.SupplyWeight();
         var tokenSupply = await _token0Client.TotalSupply();
-        var tokenReserve = Web3.Convert.FromWei(await _token0Client.BalanceOf(_account.Address));
+        var tokenReserve = await Token0Reserve();
         
         if(Math.Abs(rwaSupply-tokenSupply) < EPSIOLON){
             _logger.LogDebug("Token supply matches RWA supply");
@@ -156,4 +156,14 @@ public class Rebalancer
         }
        
     }
+
+    public async Task<decimal> Token0Reserve()
+    {
+        return Web3.Convert.FromWei(await _token0Client.BalanceOf(_account.Address));
+    }
+
+    public async Task<decimal> Token1Reserve()
+    {
+        return Web3.Convert.FromWei(await _token1Client.BalanceOf(_account.Address));
+    }
 }
diff --git a/grafana/dashboards/totalSupply.json b/grafana/dashboards/totalSupply.json
index f289337..8b02d01 100644
--- a/grafana/dashboards/totalSupply.json
+++ b/grafana/dashboards/totalSupply.json
@@ -536,6 +536,87 @@
       "title": "Available Potatos [kg] per ROC",
       "type": "timeseries"
     },
+    {
+      "datasource": {
+        "type": "prometheus",
+        "uid": "PBFA97CFB590B2093"
+      },
+      "description": "Shows the distribution of the reserves to rebalance the pool price",
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "palette-classic"
+          },
+          "custom": {
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            }
+          },
+          "mappings": [],
+          "unit": "currencyCHF"
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 7,
+        "w": 6,
+        "x": 12,
+        "y": 15
+      },
+      "id": 11,
+      "options": {
+        "displayLabels": [
+          "percent"
+        ],
+        "legend": {
+          "displayMode": "list",
+          "placement": "bottom",
+          "showLegend": true
+        },
+        "pieType": "pie",
+        "reduceOptions": {
+          "calcs": [
+            "lastNotNull"
+          ],
+          "fields": "",
+          "values": false
+        },
+        "tooltip": {
+          "mode": "single",
+          "sort": "none"
+        }
+      },
+      "pluginVersion": "11.3.0+security-01",
+      "targets": [
+        {
+          "editorMode": "code",
+          "exemplar": false,
+          "expr": "Rebalancer_Reserves_ROC*Uniswap_ROCWETH_price_WETH_per_ROC*Marketplace_Ethereum_Price_CHF",
+          "instant": true,
+          "legendFormat": "Reserves ROC",
+          "range": false,
+          "refId": "A"
+        },
+        {
+          "datasource": {
+            "type": "prometheus",
+            "uid": "PBFA97CFB590B2093"
+          },
+          "editorMode": "code",
+          "exemplar": false,
+          "expr": "Rebalancer_Reserves_ETH*Marketplace_Ethereum_Price_CHF",
+          "hide": false,
+          "instant": true,
+          "legendFormat": "Reserves (W)ETH",
+          "range": false,
+          "refId": "B"
+        }
+      ],
+      "title": "Rebalancer Reserves",
+      "type": "piechart"
+    },
     {
       "datasource": {
         "type": "prometheus",
-- 
GitLab