Skip to content

Commit 7a9c841

Browse files
authored
Add NEUTRON_ROUTER_EXTERNAL_NETWORK_ID Filter (#7)
Signed-off-by: Freerk-Ole Zakfeld <fzakfeld@scaleuptech.com>
1 parent b8db413 commit 7a9c841

4 files changed

Lines changed: 19 additions & 9 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,8 @@ DESIGNATE_ENABLED=true
5252
MANILA_ENABLED=false
5353
NEUTRON_ENABLED=true
5454
OCTAVIA_ENABLED=true
55+
56+
# Routers returned by the Neutron Exporter are filtered by a specific external network ID.
57+
# This is designed to only count the usage of routers which are connected to an external network.
58+
NEUTRON_ROUTER_EXTERNAL_NETWORK_ID=5d8722dd-186c-4e32-a170-b216a04688dc
5559
```

exporters/neutron.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ import (
88
)
99

1010
type NeutronUsageExporter struct {
11-
db *sql.DB
12-
floatingIPs *prometheus.Desc
13-
routers *prometheus.Desc
11+
db *sql.DB
12+
externalNetworkId string
13+
floatingIPs *prometheus.Desc
14+
routers *prometheus.Desc
1415
}
1516

16-
func NewNeutronUsageExporter(db *sql.DB) (*NeutronUsageExporter, error) {
17+
func NewNeutronUsageExporter(db *sql.DB, externalNetworkId string) (*NeutronUsageExporter, error) {
1718
return &NeutronUsageExporter{
18-
db: db,
19+
db: db,
20+
externalNetworkId: externalNetworkId,
1921
floatingIPs: prometheus.NewDesc(
2022
"openstack_project_floating_ips",
2123
"Total number of floating IPs per OpenStack project",
@@ -63,7 +65,7 @@ func (e *NeutronUsageExporter) collectMetrics(ch chan<- prometheus.Metric) {
6365
}
6466

6567
routerCounts := make(map[string]float64)
66-
rows, err = e.db.Query("SELECT project_id, COUNT(id) AS total_routers FROM routers GROUP BY project_id")
68+
rows, err = e.db.Query("SELECT r.project_id, COUNT(r.id) AS total_routers FROM routers r INNER JOIN ports p ON r.gw_port_id = p.id WHERE p.network_id = ? GROUP BY r.project_id", e.externalNetworkId)
6769
if err != nil {
6870
log.Println("Error querying router counts:", err)
6971
return

exporters/neutron_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func TestNeutronUsageExporter(t *testing.T) {
2323
routerRows := sqlmock.NewRows([]string{"project_id", "total_routers"}).
2424
AddRow("c352b0ed-30ca-4634-9c2d-1947efc29096", 1).
2525
AddRow("6ee08ba2-2ca1-4c91-b139-4bf0dbaa4096", 2)
26-
mock.ExpectQuery("SELECT project_id, COUNT\\(id\\) AS total_routers FROM routers GROUP BY project_id").WillReturnRows(routerRows)
26+
mock.ExpectQuery("SELECT r.project_id, COUNT\\(r.id\\) AS total_routers FROM routers r").WithArgs("5d8722dd-186c-4e32-a170-b216a04688dc").WillReturnRows(routerRows)
2727

28-
exporter, err := NewNeutronUsageExporter(db)
28+
exporter, err := NewNeutronUsageExporter(db, "5d8722dd-186c-4e32-a170-b216a04688dc")
2929
if err != nil {
3030
t.Fatalf("Failed to create NeutronUsageExporter: %v", err)
3131
}

main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,11 @@ func main() {
6969
}
7070
exporter, err = exporters.NewNovaTraitUsageExporter(db, trait)
7171
case "neutron":
72-
exporter, err = exporters.NewNeutronUsageExporter(db)
72+
externalNetworkId, exists := os.LookupEnv("NEUTRON_ROUTER_EXTERNAL_NETWORK_ID")
73+
if !exists {
74+
log.Fatalf("NEUTRON_ROUTER_EXTERNAL_NETWORK_ID not set")
75+
}
76+
exporter, err = exporters.NewNeutronUsageExporter(db, externalNetworkId)
7377
case "designate":
7478
exporter, err = exporters.NewDesignateUsageExporter(db)
7579
case "octavia":

0 commit comments

Comments
 (0)