Skip to content

Commit 0f8a10d

Browse files
feat: add Prometheus metrics endpoint (#19)
* feat: add Prometheus metrics endpoint Add /metrics endpoint with Prometheus-compatible instrumentation: - pkg/metrics: counters, histograms, gauges for requests, latency, chunks processed, reduction ratio, active requests, clusters formed - Middleware wraps /v1/dedupe and /v1/retrieve handlers - Replaces the old JSON /metrics in serve.go - Grafana dashboard template (grafana/dashboard.json) - 8 unit tests for metrics package - README monitoring section with scrape config Closes #7 Co-authored-by: Ona <no-reply@ona.com> * fix: use non-deprecated prometheus collectors Co-authored-by: Ona <no-reply@ona.com> --------- Co-authored-by: Ona <no-reply@ona.com>
1 parent ee88338 commit 0f8a10d

8 files changed

Lines changed: 614 additions & 25 deletions

File tree

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,34 @@ Or manually:
375375

376376
Connect your repo and set `OPENAI_API_KEY` in environment variables.
377377

378+
## Monitoring
379+
380+
Distill exposes a Prometheus-compatible `/metrics` endpoint on both `api` and `serve` commands.
381+
382+
### Metrics
383+
384+
| Metric | Type | Description |
385+
|--------|------|-------------|
386+
| `distill_requests_total` | Counter | Total requests by endpoint and status code |
387+
| `distill_request_duration_seconds` | Histogram | Request latency distribution |
388+
| `distill_chunks_processed_total` | Counter | Chunks processed (input/output) |
389+
| `distill_reduction_ratio` | Histogram | Chunk reduction ratio per request |
390+
| `distill_active_requests` | Gauge | Currently processing requests |
391+
| `distill_clusters_formed_total` | Counter | Clusters formed during deduplication |
392+
393+
### Prometheus Scrape Config
394+
395+
```yaml
396+
scrape_configs:
397+
- job_name: distill
398+
static_configs:
399+
- targets: ['localhost:8080']
400+
```
401+
402+
### Grafana Dashboard
403+
404+
Import the included dashboard from `grafana/dashboard.json` or use dashboard UID `distill-overview`.
405+
378406
## Architecture
379407

380408
```

cmd/api.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/Siddhant-K-code/distill/pkg/contextlab"
1515
"github.com/Siddhant-K-code/distill/pkg/embedding/openai"
16+
"github.com/Siddhant-K-code/distill/pkg/metrics"
1617
"github.com/Siddhant-K-code/distill/pkg/types"
1718
"github.com/spf13/cobra"
1819
"github.com/spf13/viper"
@@ -93,6 +94,7 @@ type APIServer struct {
9394
embedder *openai.Client
9495
validKeys map[string]bool
9596
hasAuth bool
97+
metrics *metrics.Metrics
9698
}
9799

98100
func runAPI(cmd *cobra.Command, args []string) error {
@@ -135,16 +137,22 @@ func runAPI(cmd *cobra.Command, args []string) error {
135137
}
136138
}
137139

140+
m := metrics.New()
141+
138142
server := &APIServer{
139143
embedder: embedder,
140144
validKeys: validKeys,
141145
hasAuth: len(validKeys) > 0,
146+
metrics: m,
142147
}
143148

144149
// Setup routes
145150
mux := http.NewServeMux()
146-
mux.HandleFunc("/v1/dedupe", server.handleDedupe)
151+
mux.HandleFunc("/v1/dedupe", m.Middleware("/v1/dedupe", server.handleDedupe))
147152
mux.HandleFunc("/health", server.handleHealth)
153+
mux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
154+
m.Handler().ServeHTTP(w, r)
155+
})
148156
mux.HandleFunc("/", server.handleRoot)
149157

150158
// CORS middleware
@@ -186,6 +194,7 @@ func runAPI(cmd *cobra.Command, args []string) error {
186194
fmt.Println("Endpoints:")
187195
fmt.Printf(" POST http://%s/v1/dedupe\n", addr)
188196
fmt.Printf(" GET http://%s/health\n", addr)
197+
fmt.Printf(" GET http://%s/metrics\n", addr)
189198
fmt.Println()
190199

191200
if err := httpServer.ListenAndServe(); err != http.ErrServerClosed {
@@ -219,8 +228,9 @@ func (s *APIServer) handleRoot(w http.ResponseWriter, r *http.Request) {
219228
"version": "1.0.0",
220229
"docs": "https://distill.siddhantkhare.com/docs",
221230
"endpoints": map[string]string{
222-
"dedupe": "POST /v1/dedupe",
223-
"health": "GET /health",
231+
"dedupe": "POST /v1/dedupe",
232+
"health": "GET /health",
233+
"metrics": "GET /metrics",
224234
},
225235
})
226236
}
@@ -363,6 +373,9 @@ func (s *APIServer) handleDedupe(w http.ResponseWriter, r *http.Request) {
363373
},
364374
}
365375

376+
// Record dedup-specific metrics
377+
s.metrics.RecordDedup("/v1/dedupe", len(req.Chunks), len(representatives), clusterResult.ClusterCount)
378+
366379
w.Header().Set("Content-Type", "application/json")
367380
_ = json.NewEncoder(w).Encode(resp)
368381
}

cmd/serve.go

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/Siddhant-K-code/distill/pkg/contextlab"
1414
"github.com/Siddhant-K-code/distill/pkg/embedding/openai"
15+
"github.com/Siddhant-K-code/distill/pkg/metrics"
1516
"github.com/Siddhant-K-code/distill/pkg/retriever"
1617
pcretriever "github.com/Siddhant-K-code/distill/pkg/retriever/pinecone"
1718
qdretriever "github.com/Siddhant-K-code/distill/pkg/retriever/qdrant"
@@ -77,8 +78,9 @@ func init() {
7778

7879
// Server holds the HTTP server state.
7980
type Server struct {
80-
broker *contextlab.Broker
81-
cfg ServerConfig
81+
broker *contextlab.Broker
82+
cfg ServerConfig
83+
metrics *metrics.Metrics
8284
}
8385

8486
// ServerConfig holds server configuration.
@@ -232,20 +234,25 @@ func runServe(cmd *cobra.Command, args []string) error {
232234
}
233235
defer func() { _ = broker.Close() }()
234236

237+
m := metrics.New()
238+
235239
// Create server
236240
server := &Server{
237241
broker: broker,
238242
cfg: ServerConfig{
239243
Host: host,
240244
Port: port,
241245
},
246+
metrics: m,
242247
}
243248

244249
// Setup routes
245250
mux := http.NewServeMux()
246-
mux.HandleFunc("/v1/retrieve", server.handleRetrieve)
251+
mux.HandleFunc("/v1/retrieve", m.Middleware("/v1/retrieve", server.handleRetrieve))
247252
mux.HandleFunc("/health", server.handleHealth)
248-
mux.HandleFunc("/metrics", server.handleMetrics)
253+
mux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
254+
m.Handler().ServeHTTP(w, r)
255+
})
249256

250257
// Create HTTP server
251258
addr := fmt.Sprintf("%s:%d", host, port)
@@ -370,6 +377,9 @@ func (s *Server) handleRetrieve(w http.ResponseWriter, r *http.Request) {
370377
},
371378
}
372379

380+
// Record dedup-specific metrics
381+
s.metrics.RecordDedup("/v1/retrieve", result.Stats.Retrieved, result.Stats.Returned, result.Stats.Clustered)
382+
373383
w.Header().Set("Content-Type", "application/json")
374384
_ = json.NewEncoder(w).Encode(resp)
375385
}
@@ -378,17 +388,3 @@ func (s *Server) handleHealth(w http.ResponseWriter, r *http.Request) {
378388
w.Header().Set("Content-Type", "application/json")
379389
_ = json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
380390
}
381-
382-
func (s *Server) handleMetrics(w http.ResponseWriter, r *http.Request) {
383-
cfg := s.broker.GetConfig()
384-
w.Header().Set("Content-Type", "application/json")
385-
_ = json.NewEncoder(w).Encode(map[string]interface{}{
386-
"config": map[string]interface{}{
387-
"over_fetch_k": cfg.OverFetchK,
388-
"target_k": cfg.TargetK,
389-
"threshold": cfg.ClusterThreshold,
390-
"lambda": cfg.MMRLambda,
391-
"mmr_enabled": cfg.EnableMMR,
392-
},
393-
})
394-
}

go.mod

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ toolchain go1.24.11
77
require (
88
github.com/mark3labs/mcp-go v0.43.2
99
github.com/pinecone-io/go-pinecone/v3 v3.1.0
10+
github.com/prometheus/client_golang v1.23.2
11+
github.com/prometheus/client_model v0.6.2
1012
github.com/qdrant/go-client v1.16.2
1113
github.com/schollz/progressbar/v3 v3.14.6
1214
github.com/spf13/cobra v1.8.1
@@ -18,7 +20,9 @@ require (
1820
require (
1921
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
2022
github.com/bahlo/generic-list-go v0.2.0 // indirect
23+
github.com/beorn7/perks v1.0.1 // indirect
2124
github.com/buger/jsonparser v1.1.1 // indirect
25+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2226
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
2327
github.com/fsnotify/fsnotify v1.7.0 // indirect
2428
github.com/google/uuid v1.6.0 // indirect
@@ -29,9 +33,12 @@ require (
2933
github.com/mailru/easyjson v0.7.7 // indirect
3034
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
3135
github.com/mitchellh/mapstructure v1.5.0 // indirect
36+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
3237
github.com/oapi-codegen/runtime v1.1.1 // indirect
3338
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
3439
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
40+
github.com/prometheus/common v0.66.1 // indirect
41+
github.com/prometheus/procfs v0.16.1 // indirect
3542
github.com/rivo/uniseg v0.4.7 // indirect
3643
github.com/sagikazarmark/locafero v0.4.0 // indirect
3744
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
@@ -45,6 +52,7 @@ require (
4552
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
4653
go.uber.org/atomic v1.9.0 // indirect
4754
go.uber.org/multierr v1.9.0 // indirect
55+
go.yaml.in/yaml/v2 v2.4.2 // indirect
4856
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
4957
golang.org/x/net v0.47.0 // indirect
5058
golang.org/x/sys v0.38.0 // indirect

go.sum

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D
33
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
44
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
55
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
6+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
7+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
68
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
79
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
810
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
11+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
12+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
913
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
1014
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1115
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -34,10 +38,14 @@ github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uO
3438
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
3539
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
3640
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
41+
github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co=
42+
github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0=
3743
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
3844
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
3945
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
4046
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
47+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
48+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
4149
github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE=
4250
github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
4351
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
@@ -49,6 +57,8 @@ github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2Em
4957
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
5058
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
5159
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
60+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
61+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
5262
github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro=
5363
github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
5464
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
@@ -58,12 +68,20 @@ github.com/pinecone-io/go-pinecone/v3 v3.1.0/go.mod h1:v8VJwwmZFesCP3bIYv98eU/kI
5868
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5969
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
6070
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
71+
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
72+
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
73+
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
74+
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
75+
github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
76+
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
77+
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
78+
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
6179
github.com/qdrant/go-client v1.16.2 h1:UUMJJfvXTByhwhH1DwWdbkhZ2cTdvSqVkXSIfBrVWSg=
6280
github.com/qdrant/go-client v1.16.2/go.mod h1:I+EL3h4HRoRTeHtbfOd/4kDXwCukZfkd41j/9wryGkw=
6381
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
6482
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
65-
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
66-
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
83+
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
84+
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
6785
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
6886
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
6987
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
@@ -115,8 +133,12 @@ go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJr
115133
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
116134
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
117135
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
136+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
137+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
118138
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
119139
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
140+
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
141+
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
120142
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
121143
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
122144
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
@@ -141,8 +163,8 @@ google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94U
141163
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
142164
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
143165
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
144-
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
145-
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
166+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
167+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
146168
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
147169
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
148170
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)