From 0f9112e8ddb69e72bfaa695f915fabd001bfb41d Mon Sep 17 00:00:00 2001 From: Simon Rieger Date: Tue, 11 Mar 2025 02:59:57 +0100 Subject: [PATCH] add more logging --- go/main.go | 161 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 90 insertions(+), 71 deletions(-) diff --git a/go/main.go b/go/main.go index 68b8d77..06f6cf3 100644 --- a/go/main.go +++ b/go/main.go @@ -16,17 +16,17 @@ import ( type StatusResponse struct { Data []struct { - ID int `json:"id"` - User struct { + ID int `json:"id"` + User struct { DisplayName string `json:"displayName"` Username string `json:"username"` } `json:"userDetails"` Train struct { - Trip int `json:"trip"` - Category string `json:"category"` - LineName string `json:"lineName"` - JourneyNumber int `json:"journeyNumber"` - Origin struct { + Trip int `json:"trip"` + Category string `json:"category"` + LineName string `json:"lineName"` + JourneyNumber int `json:"journeyNumber"` + Origin struct { Name string `json:"name"` DeparturePlanned string `json:"departurePlanned"` DepartureReal string `json:"departureReal"` @@ -87,31 +87,31 @@ func fetchStatuses(username string) (*StatusResponse, error) { client := &http.Client{Timeout: 10 * time.Second} req, err := http.NewRequest("GET", url, 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") 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("Accept", "application/json") resp, err := client.Do(req) 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() 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 err = json.NewDecoder(resp.Body).Decode(&apiResponse) 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 } @@ -121,51 +121,51 @@ func fetchUserDetails(username string) (*UserDetailsResponse, error) { client := &http.Client{Timeout: 10 * time.Second} req, err := http.NewRequest("GET", url, 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") 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("Accept", "application/json") resp, err := client.Do(req) 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() 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 err = json.NewDecoder(resp.Body).Decode(&apiResponse) 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 } func isTrainActive(departureTimeStr, arrivalTimeStr string) bool { if departureTimeStr == "" || arrivalTimeStr == "" { - return false - } + return false + } departureTime, err := time.Parse(time.RFC3339, departureTimeStr) if err != nil { - log.Printf("Fehler beim Parsen der Abfahrtszeit: %v\n", err) - return false - } + log.Printf("Fehler beim Parsen der Abfahrtszeit: %v\n", err) + return false + } arrivalTime, err := time.Parse(time.RFC3339, arrivalTimeStr) if err != nil { - log.Printf("Fehler beim Parsen der Ankunftszeit: %v\n", err) - return false - } + log.Printf("Fehler beim Parsen der Ankunftszeit: %v\n", err) + return false + } now := time.Now() return now.After(departureTime) && now.Before(arrivalTime) @@ -174,38 +174,57 @@ func isTrainActive(departureTimeStr, arrivalTimeStr string) bool { func updateMetricsForUser(username string) { statusData, err := fetchStatuses(username) if err != nil { - log.Printf("Fehler beim Abrufen der Statusdaten für Benutzer '%s': %v\n", username, err) - return - } + log.Printf("Fehler beim Abrufen der Statusdaten für Benutzer '%s': %v\n", username, err) + return + } userDetails, err := fetchUserDetails(username) if err != nil { - log.Printf("Fehler beim Abrufen der Benutzerdetails für Benutzer '%s': %v\n", username, err) - return - } + log.Printf("Fehler beim Abrufen der Benutzerdetails für Benutzer '%s': %v\n", username, err) + return + } 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" - switch trip.Train.TripType { - case 0: - tripType = "personal" - case 1: - tripType = "business" - case 2: - tripType = "commute" - } + tripType := "unknown" + switch trip.Train.TripType { + case 0: + tripType = "personal" + case 1: + tripType = "business" + case 2: + tripType = "commute" + } - currentTrainStatuses.WithLabelValues( - username, - trip.Train.LineName, - trip.Train.Origin.Name, - trip.Train.Destination.Name, - trip.Train.Category, - tripType, - ).Set(func() float64 { if active { return 1 } else { return 0 } }()) - } + currentTrainStatuses.WithLabelValues( + username, + trip.Train.LineName, + trip.Train.Origin.Name, + trip.Train.Destination.Name, + trip.Train.Category, + tripType, + ).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) totalTrainDuration.WithLabelValues(username).Set(float64(userDetails.Data.TrainDuration)) @@ -218,23 +237,23 @@ func updateMetricsForUser(username string) { func updateMetrics() { usernames := os.Getenv("TRAEWELLING_USERNAMES") if usernames == "" { - log.Println("TRAEWELLING_USERNAMES ist nicht gesetzt") - return - } + log.Println("TRAEWELLING_USERNAMES ist nicht gesetzt") + return + } for _, username := range strings.Split(usernames, ",") { - username = strings.TrimSpace(username) - updateMetricsForUser(username) - } + username = strings.TrimSpace(username) + updateMetricsForUser(username) + } } func main() { go func() { - for { - updateMetrics() - time.Sleep(5 * time.Minute) // Aktualisierung alle 5 Minuten - } - }() + for { + updateMetrics() + time.Sleep(5 * time.Minute) // Aktualisierung alle 5 Minuten + } + }() http.Handle("/metrics", promhttp.Handler()) fmt.Println("Server läuft auf Port 8080...")