From c2f47992b8822abee962c59f2c7da704172ae2c6 Mon Sep 17 00:00:00 2001 From: Simon Rieger Date: Fri, 13 Dec 2024 01:01:27 +0100 Subject: [PATCH] add postgresql support --- .env | 3 -- .env.example | 8 +++ .gitignore | 3 ++ README.md | 127 ++++++++++++++++++++++----------------------- docker-compose.yml | 30 +++++++++++ go/go.mod | 1 + go/go.sum | 2 + go/main.go | 35 ++++++++++--- 8 files changed, 135 insertions(+), 74 deletions(-) delete mode 100644 .env create mode 100644 .env.example diff --git a/.env b/.env deleted file mode 100644 index b5cd3a7..0000000 --- a/.env +++ /dev/null @@ -1,3 +0,0 @@ -# Bitte die Domain wie oben anpassen - -PUBLIC_APP_URL=https://pocket-id.brothertec.eu diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..28f18e9 --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +# Bitte die Domain wie oben anpassen + +PUBLIC_APP_URL=https://pocket-id.brothertec.eu +POSTGRES_CONNECTION_STRING_ENV=postgresql://pocket-id:password@db:5432/pocket-id +POSTGRES_USER_ENV=pocket-id +POSTGRES_PASSWORD_ENV=password +POSTGRES_DB_ENV=pocket-id +DB_CONNECTION_ENV="host=db port=5432 user=pocket-id dbname=pocket-id password=password sslmode=disable" diff --git a/.gitignore b/.gitignore index 8fce603..39856e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ data/ +postgres_data/ +dump.sql +.env diff --git a/README.md b/README.md index 5fc3ade..03db035 100644 --- a/README.md +++ b/README.md @@ -1,97 +1,94 @@ -# pocket-id-exporter +# Pocket ID Metrics Exporter -Der pocket-id-exporter ist ein Prometheus-Exporter für die Pocket ID-Datenbank. Er stellt Metriken über die Anzahl der Anmeldungen und Benutzer bereit. +Dieser Pocket ID Metrics Exporter ist ein Go-Programm, das Metriken aus einer Datenbank (SQLite oder PostgreSQL) ausliest und diese für Prometheus bereitstellt. ## Funktionen -- Exportiert die Gesamtzahl der Anmeldungen als Metrik `pocket_id_login_count` -- Exportiert die Gesamtzahl der Benutzer als Metrik `pocket_id_user_count` -- Stellt Metriken im Prometheus-Format unter dem `/metrics`-Endpunkt bereit +- Unterstützung für SQLite und PostgreSQL Datenbanken +- Erfassung der Gesamtanzahl der Anmeldungen +- Erfassung der Gesamtanzahl der Benutzer +- Bereitstellung der Metriken über einen HTTP-Endpunkt für Prometheus ## Voraussetzungen -- Docker -- Docker Compose +- Go 1.15 oder höher +- SQLite oder PostgreSQL Datenbank +- Zugriff auf die Tabellen `Audit_Logs` und `Users` in der Datenbank -## Verwendung mit Docker Compose +## Installation -1. Erstellen Sie eine `docker-compose.yml`-Datei im Projektverzeichnis mit folgendem Inhalt: +1. Klonen Sie das Repository: + ``` + git clone https://github.com/yourusername/pocket-id-metrics-exporter.git + cd pocket-id-metrics-exporter + ``` -```yaml -version: '3' -services: - pocket-id-exporter: - build: . - ports: - - "3000:3000" - volumes: - - ./data:/app/data +2. Installieren Sie die erforderlichen Abhängigkeiten: + ``` + go get github.com/prometheus/client_golang/prometheus + go get github.com/prometheus/client_golang/prometheus/promhttp + go get github.com/lib/pq + go get github.com/mattn/go-sqlite3 + ``` + +## Konfiguration + +Das Programm verwendet Umgebungsvariablen für die Konfiguration: + +- `DB_TYPE`: Der Typ der Datenbank ("sqlite3" oder "postgres") +- `DB_CONNECTION`: Die Verbindungszeichenfolge für die Datenbank + +### Beispiele: + +Für SQLite: +``` +export DB_TYPE=sqlite3 +export DB_CONNECTION=./data/pocket-id.db ``` -2. Erstellen Sie eine `Dockerfile` im Projektverzeichnis: - -```Dockerfile -FROM golang:1.17-alpine - -WORKDIR /app - -COPY go.mod go.sum ./ -RUN go mod download - -COPY . . -RUN go build -o pocket-id-exporter - -EXPOSE 3000 - -CMD ["./pocket-id-exporter"] +Für PostgreSQL: +``` +export DB_TYPE=postgres +export DB_CONNECTION="host=localhost port=5432 user=yourusername dbname=yourdbname password=yourpassword sslmode=disable" ``` -3. Stellen Sie sicher, dass Ihre SQLite-Datenbank im Verzeichnis `./data` mit dem Namen `pocket-id.db` liegt. +## Verwendung -4. Bauen und starten Sie den Container mit Docker Compose: +1. Setzen Sie die Umgebungsvariablen wie oben beschrieben. -```bash -docker-compose up --build -``` +2. Starten Sie das Programm: + ``` + go run main.go + ``` -Der Exporter ist nun unter `http://localhost:3000/metrics` erreichbar. +3. Das Programm läuft nun auf `http://localhost:3000`. Die Metriken sind unter dem `/metrics` Endpunkt verfügbar. -## Konfiguration von Prometheus +## Metriken -Fügen Sie folgende Job-Konfiguration zu Ihrer `prometheus.yml` hinzu, um die Metriken zu scrapen: +- `pocket_id_login_count`: Gesamtanzahl der Anmeldungen +- `pocket_id_user_count`: Gesamtanzahl der Benutzer + +## Prometheus Konfiguration + +Fügen Sie folgende Job-Konfiguration zu Ihrer `prometheus.yml` hinzu: ```yaml scrape_configs: - - job_name: 'pocket-id' + - job_name: 'pocket_id_metrics' static_configs: - targets: ['localhost:3000'] ``` -## Entwicklung +## Fehlerbehebung -Um den Exporter lokal zu entwickeln und zu testen: +- Stellen Sie sicher, dass die Datenbank erreichbar ist und die erforderlichen Tabellen existieren. +- Überprüfen Sie die Konsolenausgabe auf Fehlermeldungen. +- Vergewissern Sie sich, dass die Umgebungsvariablen korrekt gesetzt sind. -1. Installieren Sie Go (Version 1.17 oder höher) -2. Klonen Sie das Repository -3. Installieren Sie die Abhängigkeiten: +## Beitragen -```bash -go mod download -``` - -4. Bauen und starten Sie den Exporter: - -```bash -go build -./pocket-id-exporter -``` +Beiträge sind willkommen! Bitte erstellen Sie einen Pull Request oder öffnen Sie ein Issue für Vorschläge und Fehlermeldungen. ## Lizenz -[MIT License](LICENSE) - -https://github.com/stonith404/pocket-id - -https://goneuland.de/pocket-id-mit-docker-und-traefik-installieren/ - -https://github.com/stonith404/pocket-id/issues/56 +Dieses Projekt steht unter der MIT-Lizenz. Siehe die [LICENSE](LICENSE) Datei für Details. diff --git a/docker-compose.yml b/docker-compose.yml index fd74aa7..47f4d45 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,11 @@ services: - VIRTUAL_PORT=80 - LETSENCRYPT_HOST=pocket-id.brothertec.eu - LETSENCRYPT_EMAIL=admin@brothertec.eu + - DB_PROVIDER=postgres + - POSTGRES_CONNECTION_STRING=$POSTGRES_CONNECTION_STRING_ENV + + depends_on: + - db labels: - "com.centurylinklabs.watchtower.enable=true" @@ -22,6 +27,24 @@ services: - proxy - edge-tier + db: + image: postgres:17 + environment: + POSTGRES_USER: $POSTGRES_USER_ENV + POSTGRES_PASSWORD: $POSTGRES_PASSWORD_ENV + POSTGRES_DB: $POSTGRES_DB_ENV + volumes: + - ./postgres_data:/var/lib/postgresql/data + restart: always + networks: + default: + dns: + ipv4_address: 172.28.0.123 + ports: + - "5432:5432" + labels: + - "com.centurylinklabs.watchtower.enable=true" + pocket-id-exporter: container_name: pocket-id-exporter build: @@ -34,6 +57,13 @@ services: # - "3000:3000" environment: - TZ=Europe/Berlin + - DB_TYPE=postgres + - DB_CONNECTION=$DB_CONNECTION_ENV + #- DB_TYPE=sqlite3 + #- DB_CONNECTION=./data/pocket-id.db + + depends_on: + - db restart: always diff --git a/go/go.mod b/go/go.mod index 068a048..a4d4069 100644 --- a/go/go.mod +++ b/go/go.mod @@ -3,6 +3,7 @@ module pocket-id-exporter go 1.20 require ( + github.com/lib/pq v1.10.9 github.com/mattn/go-sqlite3 v1.14.24 github.com/prometheus/client_golang v1.20.5 ) diff --git a/go/go.sum b/go/go.sum index 668d781..6c9b783 100644 --- a/go/go.sum +++ b/go/go.sum @@ -6,6 +6,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= diff --git a/go/main.go b/go/main.go index f23e695..6e446e8 100644 --- a/go/main.go +++ b/go/main.go @@ -4,15 +4,16 @@ import ( "database/sql" "log" "net/http" + "os" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" + _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" ) const ( - dbPath = "./data/pocket-id.db" - port = ":3000" + port = ":3000" ) var ( @@ -35,14 +36,26 @@ func init() { } func main() { + dbType := os.Getenv("DB_TYPE") + dbConnection := os.Getenv("DB_CONNECTION") + + if dbType == "" || dbConnection == "" { + log.Fatal("DB_TYPE and DB_CONNECTION environment variables must be set") + } + var err error - db, err = sql.Open("sqlite3", dbPath) + db, err = sql.Open(dbType, dbConnection) if err != nil { log.Fatalf("Error opening database: %v", err) } defer db.Close() - log.Println("Connected to the Pocket ID SQLite database.") + err = db.Ping() + if err != nil { + log.Fatalf("Error connecting to the database: %v", err) + } + + log.Printf("Connected to the %s database.", dbType) http.HandleFunc("/metrics", metricsHandler) http.Handle("/", promhttp.Handler()) @@ -59,14 +72,24 @@ func metricsHandler(w http.ResponseWriter, r *http.Request) { func updateMetrics() { var count int - err := db.QueryRow("SELECT COUNT(*) FROM Audit_Logs WHERE event = 'SIGN_IN'").Scan(&count) + query := "SELECT COUNT(*) FROM Audit_Logs WHERE event = 'SIGN_IN'" + if os.Getenv("DB_TYPE") == "postgres" { + query = "SELECT COUNT(*) FROM audit_logs WHERE event = 'SIGN_IN'" + } + + err := db.QueryRow(query).Scan(&count) if err != nil { log.Printf("Error querying login count: %v", err) } else { loginCount.Set(float64(count)) } - err = db.QueryRow("SELECT COUNT(*) FROM Users").Scan(&count) + query = "SELECT COUNT(*) FROM Users" + if os.Getenv("DB_TYPE") == "postgres" { + query = "SELECT COUNT(*) FROM users" + } + + err = db.QueryRow(query).Scan(&count) if err != nil { log.Printf("Error querying user count: %v", err) } else {