add more logging

This commit is contained in:
Simon Rieger 2025-03-11 02:59:57 +01:00
parent b5a12c4926
commit 0f9112e8dd

View file

@ -16,17 +16,17 @@ import (
type StatusResponse struct { type StatusResponse struct {
Data []struct { Data []struct {
ID int `json:"id"` ID int `json:"id"`
User struct { User struct {
DisplayName string `json:"displayName"` DisplayName string `json:"displayName"`
Username string `json:"username"` Username string `json:"username"`
} `json:"userDetails"` } `json:"userDetails"`
Train struct { Train struct {
Trip int `json:"trip"` Trip int `json:"trip"`
Category string `json:"category"` Category string `json:"category"`
LineName string `json:"lineName"` LineName string `json:"lineName"`
JourneyNumber int `json:"journeyNumber"` JourneyNumber int `json:"journeyNumber"`
Origin struct { Origin struct {
Name string `json:"name"` Name string `json:"name"`
DeparturePlanned string `json:"departurePlanned"` DeparturePlanned string `json:"departurePlanned"`
DepartureReal string `json:"departureReal"` DepartureReal string `json:"departureReal"`
@ -87,31 +87,31 @@ func fetchStatuses(username string) (*StatusResponse, error) {
client := &http.Client{Timeout: 10 * time.Second} client := &http.Client{Timeout: 10 * time.Second}
req, err := http.NewRequest("GET", url, nil) req, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("Fehler beim Erstellen der Anfrage: %v", err) return nil, fmt.Errorf("Fehler beim Erstellen der Anfrage: %v", err)
} }
token := os.Getenv("TRAEWELLING_TOKEN") token := os.Getenv("TRAEWELLING_TOKEN")
if token == "" { if token == "" {
return nil, fmt.Errorf("TRAEWELLING_TOKEN ist nicht gesetzt") return nil, fmt.Errorf("TRAEWELLING_TOKEN ist nicht gesetzt")
} }
req.Header.Set("Authorization", "Bearer "+token) req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Accept", "application/json") req.Header.Set("Accept", "application/json")
resp, err := client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("Fehler beim Senden der Anfrage für Benutzer '%s': %v", username, err) return nil, fmt.Errorf("Fehler beim Senden der Anfrage für Benutzer '%s': %v", username, err)
} }
defer resp.Body.Close() defer resp.Body.Close()
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Fehlerhafte Antwort für Benutzer '%s': %d", username, resp.StatusCode) return nil, fmt.Errorf("Fehlerhafte Antwort für Benutzer '%s': %d", username, resp.StatusCode)
} }
var apiResponse StatusResponse var apiResponse StatusResponse
err = json.NewDecoder(resp.Body).Decode(&apiResponse) err = json.NewDecoder(resp.Body).Decode(&apiResponse)
if err != nil { if err != nil {
return nil, fmt.Errorf("Fehler beim Parsen der JSON-Daten für Benutzer '%s': %v", username, err) return nil, fmt.Errorf("Fehler beim Parsen der JSON-Daten für Benutzer '%s': %v", username, err)
} }
return &apiResponse, nil return &apiResponse, nil
} }
@ -121,51 +121,51 @@ func fetchUserDetails(username string) (*UserDetailsResponse, error) {
client := &http.Client{Timeout: 10 * time.Second} client := &http.Client{Timeout: 10 * time.Second}
req, err := http.NewRequest("GET", url, nil) req, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("Fehler beim Erstellen der Benutzerdetail Anfrage: %v", err) return nil, fmt.Errorf("Fehler beim Erstellen der Benutzerdetail Anfrage: %v", err)
} }
token := os.Getenv("TRAEWELLING_TOKEN") token := os.Getenv("TRAEWELLING_TOKEN")
if token == "" { if token == "" {
return nil, fmt.Errorf("TRAEWELLING_TOKEN ist nicht gesetzt") return nil, fmt.Errorf("TRAEWELLING_TOKEN ist nicht gesetzt")
} }
req.Header.Set("Authorization", "Bearer "+token) req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Accept", "application/json") req.Header.Set("Accept", "application/json")
resp, err := client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("Fehler beim Senden der Benutzerdetail Anfrage für Benutzer '%s': %v", username, err) return nil, fmt.Errorf("Fehler beim Senden der Benutzerdetail Anfrage für Benutzer '%s': %v", username, err)
} }
defer resp.Body.Close() defer resp.Body.Close()
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Fehlerhafte Benutzerdetail Antwort für Benutzer '%s': %d", username, resp.StatusCode) return nil, fmt.Errorf("Fehlerhafte Benutzerdetail Antwort für Benutzer '%s': %d", username, resp.StatusCode)
} }
var apiResponse UserDetailsResponse var apiResponse UserDetailsResponse
err = json.NewDecoder(resp.Body).Decode(&apiResponse) err = json.NewDecoder(resp.Body).Decode(&apiResponse)
if err != nil { if err != nil {
return nil, fmt.Errorf("Fehler beim Parsen der JSON-Daten der Benutzerdetails für Benutzer '%s': %v", username, err) return nil, fmt.Errorf("Fehler beim Parsen der JSON-Daten der Benutzerdetails für Benutzer '%s': %v", username, err)
} }
return &apiResponse, nil return &apiResponse, nil
} }
func isTrainActive(departureTimeStr, arrivalTimeStr string) bool { func isTrainActive(departureTimeStr, arrivalTimeStr string) bool {
if departureTimeStr == "" || arrivalTimeStr == "" { if departureTimeStr == "" || arrivalTimeStr == "" {
return false return false
} }
departureTime, err := time.Parse(time.RFC3339, departureTimeStr) departureTime, err := time.Parse(time.RFC3339, departureTimeStr)
if err != nil { if err != nil {
log.Printf("Fehler beim Parsen der Abfahrtszeit: %v\n", err) log.Printf("Fehler beim Parsen der Abfahrtszeit: %v\n", err)
return false return false
} }
arrivalTime, err := time.Parse(time.RFC3339, arrivalTimeStr) arrivalTime, err := time.Parse(time.RFC3339, arrivalTimeStr)
if err != nil { if err != nil {
log.Printf("Fehler beim Parsen der Ankunftszeit: %v\n", err) log.Printf("Fehler beim Parsen der Ankunftszeit: %v\n", err)
return false return false
} }
now := time.Now() now := time.Now()
return now.After(departureTime) && now.Before(arrivalTime) return now.After(departureTime) && now.Before(arrivalTime)
@ -174,38 +174,57 @@ func isTrainActive(departureTimeStr, arrivalTimeStr string) bool {
func updateMetricsForUser(username string) { func updateMetricsForUser(username string) {
statusData, err := fetchStatuses(username) statusData, err := fetchStatuses(username)
if err != nil { if err != nil {
log.Printf("Fehler beim Abrufen der Statusdaten für Benutzer '%s': %v\n", username, err) log.Printf("Fehler beim Abrufen der Statusdaten für Benutzer '%s': %v\n", username, err)
return return
} }
userDetails, err := fetchUserDetails(username) userDetails, err := fetchUserDetails(username)
if err != nil { if err != nil {
log.Printf("Fehler beim Abrufen der Benutzerdetails für Benutzer '%s': %v\n", username, err) log.Printf("Fehler beim Abrufen der Benutzerdetails für Benutzer '%s': %v\n", username, err)
return return
} }
for _, trip := range statusData.Data { for _, trip := range statusData.Data {
active := isTrainActive(trip.Train.Origin.DepartureReal, trip.Train.Destination.ArrivalReal) active := isTrainActive(trip.Train.Origin.DepartureReal, trip.Train.Destination.ArrivalReal)
tripType := "unknown" tripType := "unknown"
switch trip.Train.TripType { switch trip.Train.TripType {
case 0: case 0:
tripType = "personal" tripType = "personal"
case 1: case 1:
tripType = "business" tripType = "business"
case 2: case 2:
tripType = "commute" tripType = "commute"
} }
currentTrainStatuses.WithLabelValues( currentTrainStatuses.WithLabelValues(
username, username,
trip.Train.LineName, trip.Train.LineName,
trip.Train.Origin.Name, trip.Train.Origin.Name,
trip.Train.Destination.Name, trip.Train.Destination.Name,
trip.Train.Category, trip.Train.Category,
tripType, tripType,
).Set(func() float64 { if active { return 1 } else { return 0 } }()) ).Set(func() float64 {
} if active {
return 1
} else {
return 0
}
}())
if active {
log.Printf("Aktive Verbindung für Benutzer '%s':\n", username)
log.Printf(" Linie: %s\n", trip.Train.LineName)
log.Printf(" Startbahnhof: %s\n", trip.Train.Origin.Name)
log.Printf(" Geplante Abfahrt: %s\n", trip.Train.Origin.DeparturePlanned)
log.Printf(" Tatsächliche Abfahrt: %s\n", trip.Train.Origin.DepartureReal)
log.Printf(" Zielbahnhof: %s\n", trip.Train.Destination.Name)
log.Printf(" Geplante Ankunft: %s\n", trip.Train.Destination.ArrivalPlanned)
log.Printf(" Tatsächliche Ankunft: %s\n", trip.Train.Destination.ArrivalReal)
log.Printf(" Zugtyp: %s\n", trip.Train.Category)
log.Printf(" Fahrtart: %s\n", tripType)
}
}
totalTrainDistance.WithLabelValues(username).Set(float64(userDetails.Data.TrainDistance) / 1000) totalTrainDistance.WithLabelValues(username).Set(float64(userDetails.Data.TrainDistance) / 1000)
totalTrainDuration.WithLabelValues(username).Set(float64(userDetails.Data.TrainDuration)) totalTrainDuration.WithLabelValues(username).Set(float64(userDetails.Data.TrainDuration))
@ -218,23 +237,23 @@ func updateMetricsForUser(username string) {
func updateMetrics() { func updateMetrics() {
usernames := os.Getenv("TRAEWELLING_USERNAMES") usernames := os.Getenv("TRAEWELLING_USERNAMES")
if usernames == "" { if usernames == "" {
log.Println("TRAEWELLING_USERNAMES ist nicht gesetzt") log.Println("TRAEWELLING_USERNAMES ist nicht gesetzt")
return return
} }
for _, username := range strings.Split(usernames, ",") { for _, username := range strings.Split(usernames, ",") {
username = strings.TrimSpace(username) username = strings.TrimSpace(username)
updateMetricsForUser(username) updateMetricsForUser(username)
} }
} }
func main() { func main() {
go func() { go func() {
for { for {
updateMetrics() updateMetrics()
time.Sleep(5 * time.Minute) // Aktualisierung alle 5 Minuten time.Sleep(5 * time.Minute) // Aktualisierung alle 5 Minuten
} }
}() }()
http.Handle("/metrics", promhttp.Handler()) http.Handle("/metrics", promhttp.Handler())
fmt.Println("Server läuft auf Port 8080...") fmt.Println("Server läuft auf Port 8080...")