From a06fffd2aa658e386d1dab79e8857c2de12a06a5 Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Fri, 3 Oct 2025 20:21:49 +0200 Subject: [PATCH 1/8] feat: add basic prometheus metrics --- go.mod | 16 +++++---- go.sum | 48 +++++++++++++++------------ internal/consolidator/consolidator.go | 4 +++ internal/metrics/metrics.go | 26 +++++++++++++++ internal/server/server.go | 2 ++ internal/service/service.go | 9 ++++- 6 files changed, 75 insertions(+), 30 deletions(-) create mode 100644 internal/metrics/metrics.go diff --git a/go.mod b/go.mod index 0c23e13..b227c6e 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/ipfs/go-cid v0.5.0 github.com/ipfs/go-log/v2 v2.7.0 github.com/ipld/go-ipld-prime v0.21.1-0.20240917223228-6148356a4c2e + github.com/prometheus/client_golang v1.23.2 github.com/spf13/cobra v1.2.1 github.com/spf13/viper v1.8.1 github.com/storacha/go-libstoracha v0.2.7 @@ -66,7 +67,6 @@ require ( github.com/ipfs/go-verifcid v0.0.3 // indirect github.com/ipld/go-car v0.6.2 // indirect github.com/ipld/go-codec-dagpb v1.6.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.10 // indirect @@ -81,6 +81,7 @@ require ( github.com/multiformats/go-multicodec v0.9.1 // indirect github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/ginkgo/v2 v2.23.4 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pelletier/go-toml v1.9.3 // indirect @@ -96,7 +97,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/common v0.66.1 // indirect github.com/prometheus/procfs v0.17.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect @@ -115,13 +116,14 @@ require ( go.uber.org/mock v0.5.2 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.38.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/crypto v0.41.0 // indirect golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect - golang.org/x/net v0.40.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.25.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/protobuf v1.36.6 // indirect + google.golang.org/protobuf v1.36.8 // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.4.0 // indirect diff --git a/go.sum b/go.sum index 98de1d8..e166ca9 100644 --- a/go.sum +++ b/go.sum @@ -372,6 +372,8 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -502,15 +504,15 @@ github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a h1:cgqrm0F3zwf9I github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a/go.mod h1:ocZfO/tLSHqfScRDNTJbAJR1by4D1lewauX9OwTaPuY= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= -github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= -github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= @@ -595,8 +597,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= @@ -658,6 +660,8 @@ go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -674,8 +678,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -717,8 +721,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -766,8 +770,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -796,8 +800,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -853,8 +857,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -876,8 +880,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -941,8 +945,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1063,8 +1067,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/internal/consolidator/consolidator.go b/internal/consolidator/consolidator.go index e50097f..f323d74 100644 --- a/internal/consolidator/consolidator.go +++ b/internal/consolidator/consolidator.go @@ -21,6 +21,7 @@ import ( "github.com/storacha/etracker/internal/db/consolidated" "github.com/storacha/etracker/internal/db/egress" + "github.com/storacha/etracker/internal/metrics" ) var log = logging.Logger("consolidator") @@ -143,6 +144,9 @@ func (c *Consolidator) Consolidate(ctx context.Context) error { continue } + // Increment consolidated bytes counter for this node + metrics.ConsolidatedBytesPerNode.WithLabelValues(record.NodeID.String()).Add(float64(totalBytes)) + // Issue the receipt for the consolidation operation // TODO: store in the DB _, err = receipt.Issue(c.id, result.Ok[capegress.ConsolidateOk, capegress.ConsolidateError](capegress.ConsolidateOk{}), ran.FromInvocation(inv)) diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go new file mode 100644 index 0000000..1111f1f --- /dev/null +++ b/internal/metrics/metrics.go @@ -0,0 +1,26 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + // TrackedBatchesPerNode counts the number of egress batches tracked per node + TrackedBatchesPerNode = promauto.NewCounterVec( + prometheus.CounterOpts{ + Name: "etracker_tracked_batches_total", + Help: "Total number of egress batches tracked per node", + }, + []string{"node_id"}, + ) + + // ConsolidatedBytesPerNode counts the consolidated bytes per node + ConsolidatedBytesPerNode = promauto.NewCounterVec( + prometheus.CounterOpts{ + Name: "etracker_consolidated_bytes_total", + Help: "Total consolidated bytes per node", + }, + []string{"node_id"}, + ) +) diff --git a/internal/server/server.go b/internal/server/server.go index 6dd1db4..3151b74 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -4,6 +4,7 @@ import ( "net/http" logging "github.com/ipfs/go-log/v2" + "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/storacha/go-ucanto/principal" ucanto "github.com/storacha/go-ucanto/server" @@ -40,6 +41,7 @@ func (s *Server) ListenAndServe(addr string) error { mux.HandleFunc("GET /", s.getRootHandler()) mux.HandleFunc("POST /", s.ucanHandler()) mux.HandleFunc("GET /receipts/{cid}", s.getReceiptsHandler()) + mux.Handle("GET /metrics", promhttp.Handler()) log.Infof("Listening on %s", addr) return http.ListenAndServe(addr, mux) diff --git a/internal/service/service.go b/internal/service/service.go index 0b47024..732650d 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -9,6 +9,7 @@ import ( "github.com/storacha/go-ucanto/ucan" "github.com/storacha/etracker/internal/db/egress" + "github.com/storacha/etracker/internal/metrics" ) type Service struct { @@ -21,5 +22,11 @@ func New(id principal.Signer, egressTable egress.EgressTable) (*Service, error) } func (s *Service) Record(ctx context.Context, nodeDID did.DID, receipts ucan.Link, endpoint *url.URL, cause ucan.Link) error { - return s.egressTable.Record(ctx, nodeDID, receipts, endpoint, cause) + if err := s.egressTable.Record(ctx, nodeDID, receipts, endpoint, cause); err != nil { + return err + } + + metrics.TrackedBatchesPerNode.WithLabelValues(nodeDID.String()).Inc() + + return nil } From b07cc3cb7399496990988d74fdbe81d39a52be81 Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Mon, 6 Oct 2025 20:27:39 +0200 Subject: [PATCH 2/8] metrics endpoint does bearer token auth --- .github/workflows/deploy.yml | 3 +++ .github/workflows/terraform.yml | 3 +++ .storoku.json | 7 ++++++- cmd/etracker/start.go | 9 ++++++++- deploy/.env.terraform.tpl | 3 ++- deploy/app/main.tf | 1 + deploy/app/variables.tf | 5 +++++ internal/config/config.go | 1 + internal/server/handlers.go | 12 +++++++++++ internal/server/server.go | 36 ++++++++++++++++++++++++++------- 10 files changed, 70 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 516bf9e..a7e945e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,6 +32,7 @@ jobs: # aws-region: ${{ secrets.STAGING_AWS_REGION }} # region: ${{ secrets.STAGING_AWS_REGION }} # private-key: ${{ secrets.STAGING_PRIVATE_KEY }} + # grafana-metrics-token: ${{ secrets.STAGING_GRAFANA_METRICS_TOKEN }} # cloudflare-zone-id: ${{ secrets.STAGING_CLOUDFLARE_ZONE_ID }} # cloudflare-api-token: ${{ secrets.STAGING_CLOUDFLARE_API_TOKEN }} @@ -48,6 +49,7 @@ jobs: aws-region: ${{ secrets.WARM_STAGING_AWS_REGION }} region: ${{ secrets.WARM_STAGING_AWS_REGION }} private-key: ${{ secrets.WARM_STAGING_PRIVATE_KEY }} + grafana-metrics-token: ${{ secrets.WARM_STAGING_GRAFANA_METRICS_TOKEN }} cloudflare-zone-id: ${{ secrets.WARM_STAGING_CLOUDFLARE_ZONE_ID }} cloudflare-api-token: ${{ secrets.WARM_STAGING_CLOUDFLARE_API_TOKEN }} @@ -64,5 +66,6 @@ jobs: # aws-region: ${{ secrets.PROD_AWS_REGION }} # region: ${{ secrets.PROD_AWS_REGION }} # private-key: ${{ secrets.PROD_PRIVATE_KEY }} + # grafana-metrics-token: ${{ secrets.PROD_GRAFANA_METRICS_TOKEN }} # cloudflare-zone-id: ${{ secrets.PROD_CLOUDFLARE_ZONE_ID }} # cloudflare-api-token: ${{ secrets.PROD_CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/terraform.yml b/.github/workflows/terraform.yml index 03a3e65..32fed4a 100644 --- a/.github/workflows/terraform.yml +++ b/.github/workflows/terraform.yml @@ -28,6 +28,8 @@ on: required: true region: required: true + grafana-metrics-token: + required: true cloudflare-zone-id: required: true cloudflare-api-token: @@ -49,6 +51,7 @@ env: TF_VAR_domain_base: TF_VAR_allowed_account_id: ${{ secrets.aws-account-id }} TF_VAR_region: ${{ secrets.region }} + TF_VAR_grafana_metrics_token: ${{ secrets.grafana-metrics-token }} TF_VAR_cloudflare_zone_id: ${{ secrets.cloudflare-zone-id }} CLOUDFLARE_API_TOKEN: ${{ secrets.cloudflare-api-token }} DEPLOY_ENV: ci diff --git a/.storoku.json b/.storoku.json index 3941b11..fe82d6c 100644 --- a/.storoku.json +++ b/.storoku.json @@ -11,7 +11,12 @@ "topics": null, "queues": null, "buckets": null, - "secrets": null, + "secrets": [ + { + "name": "GRAFANA_METRICS_TOKEN", + "variable": true + } + ], "tables": [ { "name": "egress-records", diff --git a/cmd/etracker/start.go b/cmd/etracker/start.go index 25a7438..882c520 100644 --- a/cmd/etracker/start.go +++ b/cmd/etracker/start.go @@ -52,6 +52,13 @@ func init() { ) cobra.CheckErr(viper.BindPFlag("did", startCmd.Flags().Lookup("did"))) + startCmd.Flags().String( + "grafana-metrics-token", + "", + "Grafana metrics token", + ) + cobra.CheckErr(viper.BindPFlag("grafana_metrics_token", startCmd.Flags().Lookup("grafana-metrics-token"))) + startCmd.Flags().String( "egress-table-name", "", @@ -123,7 +130,7 @@ func startService(cmd *cobra.Command, args []string) error { } // Create server - server, err := server.New(id, svc) + server, err := server.New(id, svc, server.WithMetricsEndpoint(cfg.GrafanaMetricsToken)) if err != nil { return fmt.Errorf("creating server: %w", err) } diff --git a/deploy/.env.terraform.tpl b/deploy/.env.terraform.tpl index fe808a9..2cb4000 100644 --- a/deploy/.env.terraform.tpl +++ b/deploy/.env.terraform.tpl @@ -6,5 +6,6 @@ TF_VAR_did= # did for your env TF_VAR_private_key= # private_key or your env -- do not commit to repo! TF_VAR_allowed_account_id=505595374361 TF_VAR_region=us-west-2 +TF_VAR_grafana_metrics_token= # enter a value for GRAFANA_METRICS_TOKEN secret TF_VAR_cloudflare_zone_id=37783d6f032b78cd97ce37ab6fd42848 -CLOUDFLARE_API_TOKEN= # enter a cloudflare api token \ No newline at end of file +CLOUDFLARE_API_TOKEN= # enter a cloudflare api token diff --git a/deploy/app/main.tf b/deploy/app/main.tf index c3a9698..398b7a5 100644 --- a/deploy/app/main.tf +++ b/deploy/app/main.tf @@ -61,6 +61,7 @@ module "app" { # enter secret values your app will use here -- these will be available # as env vars in the container at runtime secrets = { + "GRAFANA_METRICS_TOKEN" = var.grafana_metrics_token } # enter any sqs queues you want to create here queues = [] diff --git a/deploy/app/variables.tf b/deploy/app/variables.tf index ee2ee6a..d2cc75d 100644 --- a/deploy/app/variables.tf +++ b/deploy/app/variables.tf @@ -50,3 +50,8 @@ variable "network" { type = string default = "hot" } + +variable "grafana_metrics_token" { + description = "value for grafana_metrics_token secret" + type = string +} diff --git a/internal/config/config.go b/internal/config/config.go index e42caca..9c10c67 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -13,6 +13,7 @@ type Config struct { Port int `mapstructure:"port" validate:"required,min=1,max=65535"` PrivateKey string `mapstructure:"private_key" validate:"required"` DID string `mapstructure:"did" validate:"startswith=did:web:"` + GrafanaMetricsToken string `mapstructure:"grafana_metrics_token"` AWSConfig aws.Config `mapstructure:"aws_config"` EgressTableName string `mapstructure:"egress_table_name" validate:"required"` ConsolidatedTableName string `mapstructure:"consolidated_table_name" validate:"required"` diff --git a/internal/server/handlers.go b/internal/server/handlers.go index 0336279..e716c82 100644 --- a/internal/server/handlers.go +++ b/internal/server/handlers.go @@ -7,6 +7,7 @@ import ( "github.com/ipfs/go-cid" cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/storacha/go-ucanto/principal/signer" ucanhttp "github.com/storacha/go-ucanto/transport/http" @@ -63,3 +64,14 @@ func (s *Server) getReceiptsHandler() http.HandlerFunc { w.WriteHeader(http.StatusNotFound) } } + +func (s *Server) getMetricsHandler() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", s.cfg.metricsEndpointToken) { + w.WriteHeader(http.StatusUnauthorized) + return + } + + promhttp.Handler().ServeHTTP(w, r) + } +} diff --git a/internal/server/server.go b/internal/server/server.go index 3151b74..3ad1e91 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -4,7 +4,6 @@ import ( "net/http" logging "github.com/ipfs/go-log/v2" - "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/storacha/go-ucanto/principal" ucanto "github.com/storacha/go-ucanto/server" @@ -14,25 +13,43 @@ import ( var log = logging.Logger("server") +type config struct { + metricsEndpointToken string +} + +type Option func(*config) + +func WithMetricsEndpoint(authToken string) Option { + return func(c *config) { + c.metricsEndpointToken = authToken + } +} + type Server struct { + cfg *config ucantoSrv ucanto.ServerView[ucanto.Service] } -func New(id principal.Signer, svc *service.Service) (*Server, error) { - opts := serviceMethods(svc) +func New(id principal.Signer, svc *service.Service, opts ...Option) (*Server, error) { + cfg := &config{} + for _, opt := range opts { + opt(cfg) + } + + ucantoOpts := serviceMethods(svc) presolver, err := presets.NewPresetResolver() if err != nil { return nil, err } - opts = append(opts, ucanto.WithPrincipalResolver(presolver.ResolveDIDKey)) + ucantoOpts = append(ucantoOpts, ucanto.WithPrincipalResolver(presolver.ResolveDIDKey)) - ucantoSrv, err := ucanto.NewServer(id, opts...) + ucantoSrv, err := ucanto.NewServer(id, ucantoOpts...) if err != nil { return nil, err } - return &Server{ucantoSrv: ucantoSrv}, nil + return &Server{cfg: cfg, ucantoSrv: ucantoSrv}, nil } func (s *Server) ListenAndServe(addr string) error { @@ -41,7 +58,12 @@ func (s *Server) ListenAndServe(addr string) error { mux.HandleFunc("GET /", s.getRootHandler()) mux.HandleFunc("POST /", s.ucanHandler()) mux.HandleFunc("GET /receipts/{cid}", s.getReceiptsHandler()) - mux.Handle("GET /metrics", promhttp.Handler()) + + if s.cfg.metricsEndpointToken != "" { + mux.Handle("GET /metrics", s.getMetricsHandler()) + } else { + log.Warnf("Metrics endpoint is disabled") + } log.Infof("Listening on %s", addr) return http.ListenAndServe(addr, mux) From c331e15acaf02308c0642650014b515cf47359a0 Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Mon, 6 Oct 2025 23:38:54 +0200 Subject: [PATCH 3/8] use OTel SDK's prom exporter --- go.mod | 13 ++++-- go.sum | 22 ++++++--- internal/consolidator/consolidator.go | 4 +- internal/metrics/metrics.go | 64 ++++++++++++++++++++------- internal/server/handlers.go | 4 +- internal/server/server.go | 6 +++ internal/service/service.go | 4 +- 7 files changed, 88 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index b227c6e..dcfe4f2 100644 --- a/go.mod +++ b/go.mod @@ -12,11 +12,14 @@ require ( github.com/ipfs/go-cid v0.5.0 github.com/ipfs/go-log/v2 v2.7.0 github.com/ipld/go-ipld-prime v0.21.1-0.20240917223228-6148356a4c2e - github.com/prometheus/client_golang v1.23.2 github.com/spf13/cobra v1.2.1 github.com/spf13/viper v1.8.1 github.com/storacha/go-libstoracha v0.2.7 github.com/storacha/go-ucanto v0.6.4 + go.opentelemetry.io/otel v1.38.0 + go.opentelemetry.io/otel/exporters/prometheus v0.60.0 + go.opentelemetry.io/otel/metric v1.38.0 + go.opentelemetry.io/otel/sdk/metric v1.38.0 ) require ( @@ -47,6 +50,7 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect @@ -96,8 +100,10 @@ require ( github.com/pion/webrtc/v4 v4.1.3 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a // indirect + github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/otlptranslator v0.0.2 // indirect github.com/prometheus/procfs v0.17.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect @@ -109,9 +115,8 @@ require ( github.com/ucan-wg/go-ucan v0.0.0-20240916120445-37f52863156c // indirect github.com/whyrusleeping/cbor-gen v0.3.1 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/mock v0.5.2 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/go.sum b/go.sum index e166ca9..d429646 100644 --- a/go.sum +++ b/go.sum @@ -251,6 +251,8 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -513,6 +515,8 @@ github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvM github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= +github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= @@ -635,12 +639,18 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= diff --git a/internal/consolidator/consolidator.go b/internal/consolidator/consolidator.go index f323d74..32d6d50 100644 --- a/internal/consolidator/consolidator.go +++ b/internal/consolidator/consolidator.go @@ -18,6 +18,8 @@ import ( "github.com/storacha/go-ucanto/core/result" fdm "github.com/storacha/go-ucanto/core/result/failure/datamodel" "github.com/storacha/go-ucanto/principal" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "github.com/storacha/etracker/internal/db/consolidated" "github.com/storacha/etracker/internal/db/egress" @@ -145,7 +147,7 @@ func (c *Consolidator) Consolidate(ctx context.Context) error { } // Increment consolidated bytes counter for this node - metrics.ConsolidatedBytesPerNode.WithLabelValues(record.NodeID.String()).Add(float64(totalBytes)) + metrics.ConsolidatedBytesPerNode.Add(ctx, float64(totalBytes), metric.WithAttributes(attribute.String("node_id", record.NodeID.String()))) // Issue the receipt for the consolidation operation // TODO: store in the DB diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 1111f1f..825afad 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -1,26 +1,58 @@ package metrics import ( - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" + "fmt" + + logging "github.com/ipfs/go-log/v2" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/prometheus" + "go.opentelemetry.io/otel/metric" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" ) +var log = logging.Logger("metrics") + var ( // TrackedBatchesPerNode counts the number of egress batches tracked per node - TrackedBatchesPerNode = promauto.NewCounterVec( - prometheus.CounterOpts{ - Name: "etracker_tracked_batches_total", - Help: "Total number of egress batches tracked per node", - }, - []string{"node_id"}, - ) + TrackedBatchesPerNode metric.Int64Counter // ConsolidatedBytesPerNode counts the consolidated bytes per node - ConsolidatedBytesPerNode = promauto.NewCounterVec( - prometheus.CounterOpts{ - Name: "etracker_consolidated_bytes_total", - Help: "Total consolidated bytes per node", - }, - []string{"node_id"}, - ) + ConsolidatedBytesPerNode metric.Float64Counter ) + +// Init initializes the OpenTelemetry metrics with Prometheus exporter +func Init() error { + exporter, err := prometheus.New() + if err != nil { + return fmt.Errorf("failed to create prometheus exporter: %w", err) + } + + // Create a MeterProvider with the Prometheus exporter + provider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(exporter)) + + // Set the global MeterProvider + otel.SetMeterProvider(provider) + + // Get a meter + meter := provider.Meter("github.com/storacha/etracker") + + // Create counters + TrackedBatchesPerNode, err = meter.Int64Counter( + "etracker_tracked_batches_total", + metric.WithDescription("Total number of egress batches tracked per node"), + ) + if err != nil { + return fmt.Errorf("failed to create TrackedBatchesPerNode counter: %w", err) + } + + ConsolidatedBytesPerNode, err = meter.Float64Counter( + "etracker_consolidated_bytes_total", + metric.WithDescription("Total consolidated bytes per node"), + ) + if err != nil { + return fmt.Errorf("failed to create ConsolidatedBytesPerNode counter: %w", err) + } + + log.Info("OpenTelemetry metrics initialized with Prometheus exporter") + return nil +} diff --git a/internal/server/handlers.go b/internal/server/handlers.go index e716c82..8190df8 100644 --- a/internal/server/handlers.go +++ b/internal/server/handlers.go @@ -66,12 +66,14 @@ func (s *Server) getReceiptsHandler() http.HandlerFunc { } func (s *Server) getMetricsHandler() http.HandlerFunc { + promHandler := promhttp.Handler() + return func(w http.ResponseWriter, r *http.Request) { if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", s.cfg.metricsEndpointToken) { w.WriteHeader(http.StatusUnauthorized) return } - promhttp.Handler().ServeHTTP(w, r) + promHandler.ServeHTTP(w, r) } } diff --git a/internal/server/server.go b/internal/server/server.go index 3ad1e91..51886af 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -1,12 +1,14 @@ package server import ( + "fmt" "net/http" logging "github.com/ipfs/go-log/v2" "github.com/storacha/go-ucanto/principal" ucanto "github.com/storacha/go-ucanto/server" + "github.com/storacha/etracker/internal/metrics" "github.com/storacha/etracker/internal/presets" "github.com/storacha/etracker/internal/service" ) @@ -60,6 +62,10 @@ func (s *Server) ListenAndServe(addr string) error { mux.HandleFunc("GET /receipts/{cid}", s.getReceiptsHandler()) if s.cfg.metricsEndpointToken != "" { + if err := metrics.Init(); err != nil { + return fmt.Errorf("initializing metrics: %w", err) + } + mux.Handle("GET /metrics", s.getMetricsHandler()) } else { log.Warnf("Metrics endpoint is disabled") diff --git a/internal/service/service.go b/internal/service/service.go index 732650d..bf7bb2f 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -7,6 +7,8 @@ import ( "github.com/storacha/go-ucanto/did" "github.com/storacha/go-ucanto/principal" "github.com/storacha/go-ucanto/ucan" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "github.com/storacha/etracker/internal/db/egress" "github.com/storacha/etracker/internal/metrics" @@ -26,7 +28,7 @@ func (s *Service) Record(ctx context.Context, nodeDID did.DID, receipts ucan.Lin return err } - metrics.TrackedBatchesPerNode.WithLabelValues(nodeDID.String()).Inc() + metrics.TrackedBatchesPerNode.Add(ctx, 1, metric.WithAttributes(attribute.String("node_id", nodeDID.String()))) return nil } From 7ce4282833d1f8ed0f1f09b240195b8725ef1dc8 Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Tue, 7 Oct 2025 10:29:58 +0200 Subject: [PATCH 4/8] ConsolidatedBytesPerNode is an integer --- internal/consolidator/consolidator.go | 2 +- internal/metrics/metrics.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/consolidator/consolidator.go b/internal/consolidator/consolidator.go index 32d6d50..4644ac4 100644 --- a/internal/consolidator/consolidator.go +++ b/internal/consolidator/consolidator.go @@ -147,7 +147,7 @@ func (c *Consolidator) Consolidate(ctx context.Context) error { } // Increment consolidated bytes counter for this node - metrics.ConsolidatedBytesPerNode.Add(ctx, float64(totalBytes), metric.WithAttributes(attribute.String("node_id", record.NodeID.String()))) + metrics.ConsolidatedBytesPerNode.Add(ctx, int64(totalBytes), metric.WithAttributes(attribute.String("node_id", record.NodeID.String()))) // Issue the receipt for the consolidation operation // TODO: store in the DB diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 825afad..5f4f1a9 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -17,7 +17,7 @@ var ( TrackedBatchesPerNode metric.Int64Counter // ConsolidatedBytesPerNode counts the consolidated bytes per node - ConsolidatedBytesPerNode metric.Float64Counter + ConsolidatedBytesPerNode metric.Int64Counter ) // Init initializes the OpenTelemetry metrics with Prometheus exporter @@ -45,7 +45,7 @@ func Init() error { return fmt.Errorf("failed to create TrackedBatchesPerNode counter: %w", err) } - ConsolidatedBytesPerNode, err = meter.Float64Counter( + ConsolidatedBytesPerNode, err = meter.Int64Counter( "etracker_consolidated_bytes_total", metric.WithDescription("Total consolidated bytes per node"), ) From d823d749dc51597c6dfe4599b55d2f69f796fcac Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Tue, 7 Oct 2025 17:49:07 +0200 Subject: [PATCH 5/8] go mod tidy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index dcfe4f2..df2c570 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/ipfs/go-cid v0.5.0 github.com/ipfs/go-log/v2 v2.7.0 github.com/ipld/go-ipld-prime v0.21.1-0.20240917223228-6148356a4c2e + github.com/prometheus/client_golang v1.23.2 github.com/spf13/cobra v1.2.1 github.com/spf13/viper v1.8.1 github.com/storacha/go-libstoracha v0.2.7 @@ -100,7 +101,6 @@ require ( github.com/pion/webrtc/v4 v4.1.3 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a // indirect - github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.66.1 // indirect github.com/prometheus/otlptranslator v0.0.2 // indirect From c4ae63dde5a7c00ae24a87d4703c4f15b56a379e Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Tue, 7 Oct 2025 19:35:52 +0200 Subject: [PATCH 6/8] remove references to Grafana --- .github/workflows/deploy.yml | 6 +++--- .github/workflows/terraform.yml | 10 +++++----- .storoku.json | 2 +- cmd/etracker/start.go | 8 ++++---- deploy/.env.terraform.tpl | 2 +- deploy/app/main.tf | 2 +- deploy/app/variables.tf | 4 ++-- internal/config/config.go | 2 +- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a7e945e..eb4a974 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,7 +32,7 @@ jobs: # aws-region: ${{ secrets.STAGING_AWS_REGION }} # region: ${{ secrets.STAGING_AWS_REGION }} # private-key: ${{ secrets.STAGING_PRIVATE_KEY }} - # grafana-metrics-token: ${{ secrets.STAGING_GRAFANA_METRICS_TOKEN }} + # metrics-auth-token: ${{ secrets.STAGING_METRICS_AUTH_TOKEN }} # cloudflare-zone-id: ${{ secrets.STAGING_CLOUDFLARE_ZONE_ID }} # cloudflare-api-token: ${{ secrets.STAGING_CLOUDFLARE_API_TOKEN }} @@ -49,7 +49,7 @@ jobs: aws-region: ${{ secrets.WARM_STAGING_AWS_REGION }} region: ${{ secrets.WARM_STAGING_AWS_REGION }} private-key: ${{ secrets.WARM_STAGING_PRIVATE_KEY }} - grafana-metrics-token: ${{ secrets.WARM_STAGING_GRAFANA_METRICS_TOKEN }} + metrics-auth-token: ${{ secrets.WARM_STAGING_METRICS_AUTH_TOKEN }} cloudflare-zone-id: ${{ secrets.WARM_STAGING_CLOUDFLARE_ZONE_ID }} cloudflare-api-token: ${{ secrets.WARM_STAGING_CLOUDFLARE_API_TOKEN }} @@ -66,6 +66,6 @@ jobs: # aws-region: ${{ secrets.PROD_AWS_REGION }} # region: ${{ secrets.PROD_AWS_REGION }} # private-key: ${{ secrets.PROD_PRIVATE_KEY }} - # grafana-metrics-token: ${{ secrets.PROD_GRAFANA_METRICS_TOKEN }} + # metrics-auth-token: ${{ secrets.PROD_METRICS_AUTH_TOKEN }} # cloudflare-zone-id: ${{ secrets.PROD_CLOUDFLARE_ZONE_ID }} # cloudflare-api-token: ${{ secrets.PROD_CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/terraform.yml b/.github/workflows/terraform.yml index 32fed4a..a6180e2 100644 --- a/.github/workflows/terraform.yml +++ b/.github/workflows/terraform.yml @@ -28,13 +28,13 @@ on: required: true region: required: true - grafana-metrics-token: + metrics-auth-token: required: true cloudflare-zone-id: required: true cloudflare-api-token: required: true - + concurrency: group: ${{ github.workflow }}-${{ inputs.workspace }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true @@ -48,10 +48,10 @@ env: TF_VAR_private_key: ${{ secrets.private-key }} TF_VAR_did: ${{ inputs.did }} TF_VAR_app: etracker - TF_VAR_domain_base: + TF_VAR_domain_base: TF_VAR_allowed_account_id: ${{ secrets.aws-account-id }} TF_VAR_region: ${{ secrets.region }} - TF_VAR_grafana_metrics_token: ${{ secrets.grafana-metrics-token }} + TF_VAR_metrics_auth_token: ${{ secrets.metrics-auth-token }} TF_VAR_cloudflare_zone_id: ${{ secrets.cloudflare-zone-id }} CLOUDFLARE_API_TOKEN: ${{ secrets.cloudflare-api-token }} DEPLOY_ENV: ci @@ -74,7 +74,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - uses: opentofu/setup-opentofu@v1 - name: Tofu Init diff --git a/.storoku.json b/.storoku.json index fe82d6c..b969f65 100644 --- a/.storoku.json +++ b/.storoku.json @@ -13,7 +13,7 @@ "buckets": null, "secrets": [ { - "name": "GRAFANA_METRICS_TOKEN", + "name": "METRICS_AUTH_TOKEN", "variable": true } ], diff --git a/cmd/etracker/start.go b/cmd/etracker/start.go index 882c520..8dcfe4d 100644 --- a/cmd/etracker/start.go +++ b/cmd/etracker/start.go @@ -53,11 +53,11 @@ func init() { cobra.CheckErr(viper.BindPFlag("did", startCmd.Flags().Lookup("did"))) startCmd.Flags().String( - "grafana-metrics-token", + "metrics-auth-token", "", - "Grafana metrics token", + "Token required to access the /metrics endpoint", ) - cobra.CheckErr(viper.BindPFlag("grafana_metrics_token", startCmd.Flags().Lookup("grafana-metrics-token"))) + cobra.CheckErr(viper.BindPFlag("metrics_auth_token", startCmd.Flags().Lookup("metrics-auth-token"))) startCmd.Flags().String( "egress-table-name", @@ -130,7 +130,7 @@ func startService(cmd *cobra.Command, args []string) error { } // Create server - server, err := server.New(id, svc, server.WithMetricsEndpoint(cfg.GrafanaMetricsToken)) + server, err := server.New(id, svc, server.WithMetricsEndpoint(cfg.MetricsAuthToken)) if err != nil { return fmt.Errorf("creating server: %w", err) } diff --git a/deploy/.env.terraform.tpl b/deploy/.env.terraform.tpl index 2cb4000..29c1666 100644 --- a/deploy/.env.terraform.tpl +++ b/deploy/.env.terraform.tpl @@ -6,6 +6,6 @@ TF_VAR_did= # did for your env TF_VAR_private_key= # private_key or your env -- do not commit to repo! TF_VAR_allowed_account_id=505595374361 TF_VAR_region=us-west-2 -TF_VAR_grafana_metrics_token= # enter a value for GRAFANA_METRICS_TOKEN secret +TF_VAR_metrics_auth_token= # enter a value for METRICS_AUTH_TOKEN secret TF_VAR_cloudflare_zone_id=37783d6f032b78cd97ce37ab6fd42848 CLOUDFLARE_API_TOKEN= # enter a cloudflare api token diff --git a/deploy/app/main.tf b/deploy/app/main.tf index 398b7a5..ab52d9c 100644 --- a/deploy/app/main.tf +++ b/deploy/app/main.tf @@ -61,7 +61,7 @@ module "app" { # enter secret values your app will use here -- these will be available # as env vars in the container at runtime secrets = { - "GRAFANA_METRICS_TOKEN" = var.grafana_metrics_token + "METRICS_AUTH_TOKEN" = var.metrics_auth_token } # enter any sqs queues you want to create here queues = [] diff --git a/deploy/app/variables.tf b/deploy/app/variables.tf index d2cc75d..025f13c 100644 --- a/deploy/app/variables.tf +++ b/deploy/app/variables.tf @@ -51,7 +51,7 @@ variable "network" { default = "hot" } -variable "grafana_metrics_token" { - description = "value for grafana_metrics_token secret" +variable "metrics_auth_token" { + description = "value for metrics_auth_token secret" type = string } diff --git a/internal/config/config.go b/internal/config/config.go index 9c10c67..495a81c 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -13,7 +13,7 @@ type Config struct { Port int `mapstructure:"port" validate:"required,min=1,max=65535"` PrivateKey string `mapstructure:"private_key" validate:"required"` DID string `mapstructure:"did" validate:"startswith=did:web:"` - GrafanaMetricsToken string `mapstructure:"grafana_metrics_token"` + MetricsAuthToken string `mapstructure:"metrics_auth_token"` AWSConfig aws.Config `mapstructure:"aws_config"` EgressTableName string `mapstructure:"egress_table_name" validate:"required"` ConsolidatedTableName string `mapstructure:"consolidated_table_name" validate:"required"` From 59993ffc060777b0ef1af01f22840134dd011681 Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Wed, 8 Oct 2025 09:58:04 +0200 Subject: [PATCH 7/8] use WithAttributeSet instead of WithAttribute --- internal/consolidator/consolidator.go | 3 ++- internal/service/service.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/consolidator/consolidator.go b/internal/consolidator/consolidator.go index 8de97ea..68c0443 100644 --- a/internal/consolidator/consolidator.go +++ b/internal/consolidator/consolidator.go @@ -175,7 +175,8 @@ func (c *Consolidator) Consolidate(ctx context.Context) error { } // Increment consolidated bytes counter for this node - metrics.ConsolidatedBytesPerNode.Add(ctx, int64(totalBytes), metric.WithAttributes(attribute.String("node_id", record.NodeID.String()))) + attributes := attribute.NewSet(attribute.String("node_id", record.NodeID.String())) + metrics.ConsolidatedBytesPerNode.Add(ctx, int64(totalBytes), metric.WithAttributeSet(attributes)) bLog.Infof("Consolidated %d bytes for node %s (batch %s)", totalBytes, record.NodeID, record.Receipts) } diff --git a/internal/service/service.go b/internal/service/service.go index a3f475a..742855f 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -29,7 +29,8 @@ func (s *Service) Record(ctx context.Context, nodeDID did.DID, receipts ucan.Lin return err } - metrics.TrackedBatchesPerNode.Add(ctx, 1, metric.WithAttributes(attribute.String("node_id", nodeDID.String()))) + attributes := attribute.NewSet(attribute.String("node_id", nodeDID.String())) + metrics.TrackedBatchesPerNode.Add(ctx, 1, metric.WithAttributeSet(attributes)) return nil } From 2121baafd30333d57468ee6ec1d7cbf16a8ea97e Mon Sep 17 00:00:00 2001 From: Vicente Olmedo Date: Wed, 8 Oct 2025 11:50:30 +0200 Subject: [PATCH 8/8] metrics auth token is only an env var --- .storoku.json | 2 +- cmd/etracker/start.go | 7 +------ deploy/app/main.tf | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.storoku.json b/.storoku.json index b969f65..f73a30d 100644 --- a/.storoku.json +++ b/.storoku.json @@ -13,7 +13,7 @@ "buckets": null, "secrets": [ { - "name": "METRICS_AUTH_TOKEN", + "name": "ETRACKER_METRICS_AUTH_TOKEN", "variable": true } ], diff --git a/cmd/etracker/start.go b/cmd/etracker/start.go index bcd822f..82786d5 100644 --- a/cmd/etracker/start.go +++ b/cmd/etracker/start.go @@ -52,12 +52,7 @@ func init() { ) cobra.CheckErr(viper.BindPFlag("did", startCmd.Flags().Lookup("did"))) - startCmd.Flags().String( - "metrics-auth-token", - "", - "Token required to access the /metrics endpoint", - ) - cobra.CheckErr(viper.BindPFlag("metrics_auth_token", startCmd.Flags().Lookup("metrics-auth-token"))) + cobra.CheckErr(viper.BindEnv("metrics_auth_token")) startCmd.Flags().String( "egress-table-name", diff --git a/deploy/app/main.tf b/deploy/app/main.tf index ab52d9c..31caeb7 100644 --- a/deploy/app/main.tf +++ b/deploy/app/main.tf @@ -61,7 +61,7 @@ module "app" { # enter secret values your app will use here -- these will be available # as env vars in the container at runtime secrets = { - "METRICS_AUTH_TOKEN" = var.metrics_auth_token + "ETRACKER_METRICS_AUTH_TOKEN" = var.metrics_auth_token } # enter any sqs queues you want to create here queues = []