Skip to content

Commit 83e566e

Browse files
mnaserclaude
andauthored
feat: add Go main.go with Prometheus exporter-toolkit (#48)
* feat: add Go main.go with oslo.db connection string support This commit adds a complete Go-based main entry point for the OpenStack Database Exporter that integrates all existing collectors and supports oslo.db-style MySQL connection strings. Key changes: - Add cmd/openstack-database-exporter/main.go as the main entry point - Add internal/dsn package for parsing oslo.db connection strings (mysql://, mysql+pymysql://, mysql+mysqldb://, etc.) - Register all collectors based on environment variables: - CINDER_DATABASE_URL - GLANCE_DATABASE_URL - KEYSTONE_DATABASE_URL - MAGNUM_DATABASE_URL - MANILA_DATABASE_URL - NEUTRON_DATABASE_URL - OCTAVIA_DATABASE_URL - PLACEMENT_DATABASE_URL - Fix magnum collector Collect() methods to match Prometheus interface - Add github.com/go-sql-driver/mysql dependency The exporter runs on port 9180 by default (configurable via EXPORTER_PORT) and exposes metrics at /metrics endpoint. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Mohammed Naser <[email protected]> * refactor: use prometheus exporter-toolkit for HTTP server Replace custom HTTP server implementation with the standard prometheus/exporter-toolkit pattern, which provides: - TLS support via --web.config.file flag - Standard logging via promslog - Landing page with exporter info - Command-line flags via kingpin (with env var support) - Graceful shutdown handling Database URLs can now be configured via both CLI flags and environment variables: --cinder.database-url / CINDER_DATABASE_URL --glance.database-url / GLANCE_DATABASE_URL --keystone.database-url / KEYSTONE_DATABASE_URL --magnum.database-url / MAGNUM_DATABASE_URL --manila.database-url / MANILA_DATABASE_URL --neutron.database-url / NEUTRON_DATABASE_URL --octavia.database-url / OCTAVIA_DATABASE_URL --placement.database-url / PLACEMENT_DATABASE_URL 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Mohammed Naser <[email protected]> * chore: add Go binary to .gitignore 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Mohammed Naser <[email protected]> * refactor: add RegisterCollectors function to each service package Move collector registration logic into each service package, encapsulating the knowledge of which collectors exist within each package. This simplifies main.go and makes it easier to add new collectors without modifying the main entry point. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Mohammed Naser <[email protected]> * refactor: centralize collector registration and database connection handling - Add collector.NewRegistry() for centralized registry creation - Move DSN parsing to internal/db/dsn.go with Connect() in db.go - Each service package now handles its own database connection - Add Namespace constant to each service package to avoid import cycles - Move StatusToValue utility to internal/util/ to break import cycle - Log info message when collector not loaded due to missing database URL - Simplify main.go to use single collector.Config struct 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Mohammed Naser <[email protected]> * refactor: remove error return from RegisterCollectors Since errors are logged internally and we continue regardless, the error return was misleading. Now the functions simply log and return early on failure, which is more honest about the behavior. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> Signed-off-by: Mohammed Naser <[email protected]> --------- Signed-off-by: Mohammed Naser <[email protected]> Co-authored-by: Claude Opus 4.5 <[email protected]>
1 parent 31882f1 commit 83e566e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+735
-141
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.direnv
22
/target
33
result*
4+
openstack-database-exporter
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package main
2+
3+
import (
4+
"net/http"
5+
"os"
6+
7+
"github.com/alecthomas/kingpin/v2"
8+
"github.com/prometheus/client_golang/prometheus/promhttp"
9+
"github.com/prometheus/common/promslog"
10+
"github.com/prometheus/common/promslog/flag"
11+
"github.com/prometheus/common/version"
12+
"github.com/prometheus/exporter-toolkit/web"
13+
webflag "github.com/prometheus/exporter-toolkit/web/kingpinflag"
14+
15+
"github.com/vexxhost/openstack_database_exporter/internal/collector"
16+
)
17+
18+
var (
19+
metricsPath = kingpin.Flag(
20+
"web.telemetry-path",
21+
"Path under which to expose metrics.",
22+
).Default("/metrics").String()
23+
toolkitFlags = webflag.AddFlags(kingpin.CommandLine, ":9180")
24+
25+
// Database connection flags
26+
cinderDatabaseURL = kingpin.Flag(
27+
"cinder.database-url",
28+
"Cinder database connection URL (oslo.db format)",
29+
).Envar("CINDER_DATABASE_URL").String()
30+
glanceDatabaseURL = kingpin.Flag(
31+
"glance.database-url",
32+
"Glance database connection URL (oslo.db format)",
33+
).Envar("GLANCE_DATABASE_URL").String()
34+
keystoneDatabaseURL = kingpin.Flag(
35+
"keystone.database-url",
36+
"Keystone database connection URL (oslo.db format)",
37+
).Envar("KEYSTONE_DATABASE_URL").String()
38+
magnumDatabaseURL = kingpin.Flag(
39+
"magnum.database-url",
40+
"Magnum database connection URL (oslo.db format)",
41+
).Envar("MAGNUM_DATABASE_URL").String()
42+
manilaDatabaseURL = kingpin.Flag(
43+
"manila.database-url",
44+
"Manila database connection URL (oslo.db format)",
45+
).Envar("MANILA_DATABASE_URL").String()
46+
neutronDatabaseURL = kingpin.Flag(
47+
"neutron.database-url",
48+
"Neutron database connection URL (oslo.db format)",
49+
).Envar("NEUTRON_DATABASE_URL").String()
50+
octaviaDatabaseURL = kingpin.Flag(
51+
"octavia.database-url",
52+
"Octavia database connection URL (oslo.db format)",
53+
).Envar("OCTAVIA_DATABASE_URL").String()
54+
placementDatabaseURL = kingpin.Flag(
55+
"placement.database-url",
56+
"Placement database connection URL (oslo.db format)",
57+
).Envar("PLACEMENT_DATABASE_URL").String()
58+
)
59+
60+
func main() {
61+
promslogConfig := &promslog.Config{}
62+
flag.AddFlags(kingpin.CommandLine, promslogConfig)
63+
64+
kingpin.Version(version.Print("openstack_database_exporter"))
65+
kingpin.HelpFlag.Short('h')
66+
kingpin.Parse()
67+
68+
logger := promslog.New(promslogConfig)
69+
70+
logger.Info("Starting openstack_database_exporter", "version", version.Info())
71+
logger.Info("Build context", "build_context", version.BuildContext())
72+
73+
reg := collector.NewRegistry(collector.Config{
74+
CinderDatabaseURL: *cinderDatabaseURL,
75+
GlanceDatabaseURL: *glanceDatabaseURL,
76+
KeystoneDatabaseURL: *keystoneDatabaseURL,
77+
MagnumDatabaseURL: *magnumDatabaseURL,
78+
ManilaDatabaseURL: *manilaDatabaseURL,
79+
NeutronDatabaseURL: *neutronDatabaseURL,
80+
OctaviaDatabaseURL: *octaviaDatabaseURL,
81+
PlacementDatabaseURL: *placementDatabaseURL,
82+
}, logger)
83+
84+
http.Handle(*metricsPath, promhttp.HandlerFor(reg, promhttp.HandlerOpts{Registry: reg}))
85+
if *metricsPath != "/" && *metricsPath != "" {
86+
landingPage, err := web.NewLandingPage(web.LandingConfig{
87+
Name: "OpenStack Database Exporter",
88+
Description: "Prometheus Exporter for OpenStack Databases",
89+
Version: version.Info(),
90+
Links: []web.LandingLinks{
91+
{Address: *metricsPath, Text: "Metrics"},
92+
},
93+
})
94+
if err != nil {
95+
logger.Error("failed to create landing page", "err", err)
96+
os.Exit(1)
97+
}
98+
http.Handle("/", landingPage)
99+
}
100+
101+
srv := &http.Server{}
102+
if err := web.ListenAndServe(srv, toolkitFlags, logger); err != nil {
103+
logger.Error("Error starting HTTP server", "err", err)
104+
os.Exit(1)
105+
}
106+
}

go.mod

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,40 @@ go 1.24.1
44

55
require (
66
github.com/DATA-DOG/go-sqlmock v1.5.2
7+
github.com/alecthomas/kingpin/v2 v2.4.0
8+
github.com/go-sql-driver/mysql v1.9.0
79
github.com/prometheus/client_golang v1.23.2
10+
github.com/prometheus/common v0.66.1
11+
github.com/prometheus/exporter-toolkit v0.15.0
812
github.com/spf13/cast v1.10.0
913
github.com/stretchr/testify v1.11.1
1014
)
1115

1216
require (
17+
filippo.io/edwards25519 v1.1.0 // indirect
18+
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
1319
github.com/beorn7/perks v1.0.1 // indirect
1420
github.com/cespare/xxhash/v2 v2.3.0 // indirect
21+
github.com/coreos/go-systemd/v22 v22.6.0 // indirect
1522
github.com/davecgh/go-spew v1.1.1 // indirect
23+
github.com/jpillora/backoff v1.0.0 // indirect
1624
github.com/kylelemons/godebug v1.1.0 // indirect
25+
github.com/mdlayher/socket v0.4.1 // indirect
26+
github.com/mdlayher/vsock v1.2.1 // indirect
1727
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
28+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
1829
github.com/pmezard/go-difflib v1.0.0 // indirect
1930
github.com/prometheus/client_model v0.6.2 // indirect
20-
github.com/prometheus/common v0.66.1 // indirect
2131
github.com/prometheus/procfs v0.16.1 // indirect
22-
go.yaml.in/yaml/v2 v2.4.2 // indirect
23-
golang.org/x/sys v0.35.0 // indirect
32+
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
33+
go.yaml.in/yaml/v2 v2.4.3 // indirect
34+
golang.org/x/crypto v0.43.0 // indirect
35+
golang.org/x/net v0.45.0 // indirect
36+
golang.org/x/oauth2 v0.30.0 // indirect
37+
golang.org/x/sync v0.17.0 // indirect
38+
golang.org/x/sys v0.37.0 // indirect
39+
golang.org/x/text v0.30.0 // indirect
40+
golang.org/x/time v0.13.0 // indirect
2441
google.golang.org/protobuf v1.36.8 // indirect
2542
gopkg.in/yaml.v3 v3.0.1 // indirect
2643
)

go.sum

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,45 @@
1+
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
2+
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
13
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
24
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
5+
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
6+
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
7+
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
8+
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
39
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
410
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
511
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
612
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
13+
github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo=
14+
github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU=
15+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
716
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
817
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
918
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
1019
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
20+
github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo=
21+
github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw=
1122
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
1223
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
24+
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
25+
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
1326
github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE=
27+
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
28+
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
1429
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
1530
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
1631
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
1732
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
1833
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
1934
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
35+
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
36+
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
37+
github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
38+
github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
2039
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
2140
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
41+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
42+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
2243
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2344
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
2445
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
@@ -27,24 +48,43 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw
2748
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
2849
github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
2950
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
51+
github.com/prometheus/exporter-toolkit v0.15.0 h1:Pcle5sSViwR1x0gdPd0wtYrPQENBieQAM7TmT0qtb2U=
52+
github.com/prometheus/exporter-toolkit v0.15.0/go.mod h1:OyRWd2iTo6Xge9Kedvv0IhCrJSBu36JCfJ2yVniRIYk=
3053
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
3154
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
3255
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
3356
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
3457
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
3558
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
59+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
60+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
3661
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
3762
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
63+
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
64+
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
3865
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
3966
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
40-
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
41-
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
42-
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
43-
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
67+
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
68+
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
69+
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
70+
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
71+
golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM=
72+
golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
73+
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
74+
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
75+
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
76+
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
77+
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
78+
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
79+
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
80+
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
81+
golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI=
82+
golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
4483
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
4584
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
4685
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
4786
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
4887
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
88+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
4989
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
5090
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/collector/cinder/agents.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@ import (
66
"log/slog"
77

88
"github.com/prometheus/client_golang/prometheus"
9-
"github.com/vexxhost/openstack_database_exporter/internal/collector"
109
cinderdb "github.com/vexxhost/openstack_database_exporter/internal/db/cinder"
1110
)
1211

1312
var (
1413
agentStateDesc = prometheus.NewDesc(
15-
prometheus.BuildFQName(collector.Namespace, Subsystem, "agent_state"),
14+
prometheus.BuildFQName(Namespace, Subsystem, "agent_state"),
1615
"agent_state",
1716
[]string{
1817
"uuid",
@@ -37,7 +36,7 @@ func NewAgentsCollector(db *sql.DB, logger *slog.Logger) *AgentsCollector {
3736
db: db,
3837
queries: cinderdb.New(db),
3938
logger: logger.With(
40-
"namespace", collector.Namespace,
39+
"namespace", Namespace,
4140
"subsystem", Subsystem,
4241
"collector", "agents",
4342
),
Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
11
package cinder
22

3+
import (
4+
"log/slog"
5+
6+
"github.com/prometheus/client_golang/prometheus"
7+
"github.com/vexxhost/openstack_database_exporter/internal/db"
8+
)
9+
310
const (
11+
Namespace = "openstack"
412
Subsystem = "cinder"
5-
)
13+
)
14+
15+
func RegisterCollectors(registry *prometheus.Registry, databaseURL string, logger *slog.Logger) {
16+
if databaseURL == "" {
17+
logger.Info("Collector not loaded", "service", "cinder", "reason", "database URL not configured")
18+
return
19+
}
20+
21+
conn, err := db.Connect(databaseURL)
22+
if err != nil {
23+
logger.Error("Failed to connect to database", "service", "cinder", "error", err)
24+
return
25+
}
26+
27+
registry.MustRegister(NewAgentsCollector(conn, logger))
28+
registry.MustRegister(NewLimitsCollector(conn, logger))
29+
registry.MustRegister(NewPoolsCollector(conn, logger))
30+
registry.MustRegister(NewSnapshotsCollector(conn, logger))
31+
registry.MustRegister(NewVolumesCollector(conn, logger))
32+
33+
logger.Info("Registered collectors", "service", "cinder")
34+
}

internal/collector/cinder/limits.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"log/slog"
77

88
"github.com/prometheus/client_golang/prometheus"
9-
"github.com/vexxhost/openstack_database_exporter/internal/collector"
109
cinderdb "github.com/vexxhost/openstack_database_exporter/internal/db/cinder"
1110
)
1211

@@ -23,7 +22,7 @@ var FAKE_TENANTS = map[string]string{
2322

2423
var (
2524
limitsVolumeMaxGbDesc = prometheus.NewDesc(
26-
prometheus.BuildFQName(collector.Namespace, Subsystem, "limits_volume_max_gb"),
25+
prometheus.BuildFQName(Namespace, Subsystem, "limits_volume_max_gb"),
2726
"limits_volume_max_gb",
2827
[]string{
2928
"tenant",
@@ -33,7 +32,7 @@ var (
3332
)
3433

3534
limitsVolumeUsedGbDesc = prometheus.NewDesc(
36-
prometheus.BuildFQName(collector.Namespace, Subsystem, "limits_volume_used_gb"),
35+
prometheus.BuildFQName(Namespace, Subsystem, "limits_volume_used_gb"),
3736
"limits_volume_used_gb",
3837
[]string{
3938
"tenant",
@@ -43,7 +42,7 @@ var (
4342
)
4443

4544
limitsBackupMaxGbDesc = prometheus.NewDesc(
46-
prometheus.BuildFQName(collector.Namespace, Subsystem, "limits_backup_max_gb"),
45+
prometheus.BuildFQName(Namespace, Subsystem, "limits_backup_max_gb"),
4746
"limits_backup_max_gb",
4847
[]string{
4948
"tenant",
@@ -53,7 +52,7 @@ var (
5352
)
5453

5554
limitsBackupUsedGbDesc = prometheus.NewDesc(
56-
prometheus.BuildFQName(collector.Namespace, Subsystem, "limits_backup_used_gb"),
55+
prometheus.BuildFQName(Namespace, Subsystem, "limits_backup_used_gb"),
5756
"limits_backup_used_gb",
5857
[]string{
5958
"tenant",
@@ -74,7 +73,7 @@ func NewLimitsCollector(db *sql.DB, logger *slog.Logger) *LimitsCollector {
7473
db: db,
7574
queries: cinderdb.New(db),
7675
logger: logger.With(
77-
"namespace", collector.Namespace,
76+
"namespace", Namespace,
7877
"subsystem", Subsystem,
7978
"collector", "limits",
8079
),

internal/collector/cinder/pools.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ import (
55
"log/slog"
66

77
"github.com/prometheus/client_golang/prometheus"
8-
"github.com/vexxhost/openstack_database_exporter/internal/collector"
98
cinderdb "github.com/vexxhost/openstack_database_exporter/internal/db/cinder"
109
)
1110

1211
var (
1312
poolFreeGbDesc = prometheus.NewDesc(
14-
prometheus.BuildFQName(collector.Namespace, Subsystem, "pool_capacity_free_gb"),
13+
prometheus.BuildFQName(Namespace, Subsystem, "pool_capacity_free_gb"),
1514
"pool_capacity_free_gb",
1615
[]string{
1716
"name",
@@ -22,7 +21,7 @@ var (
2221
)
2322

2423
poolTotalGbDesc = prometheus.NewDesc(
25-
prometheus.BuildFQName(collector.Namespace, Subsystem, "pool_capacity_total_gb"),
24+
prometheus.BuildFQName(Namespace, Subsystem, "pool_capacity_total_gb"),
2625
"pool_capacity_total_gb",
2726
[]string{
2827
"name",
@@ -44,7 +43,7 @@ func NewPoolsCollector(db *sql.DB, logger *slog.Logger) *PoolsCollector {
4443
db: db,
4544
queries: cinderdb.New(db),
4645
logger: logger.With(
47-
"namespace", collector.Namespace,
46+
"namespace", Namespace,
4847
"subsystem", Subsystem,
4948
"collector", "pools",
5049
),

0 commit comments

Comments
 (0)