infra: add logging wrapping
Resolves issues with gcp cloud logging quirks such as field names
This commit is contained in:
@@ -3,11 +3,15 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/flowy-live/llink/internal/utils/flog"
|
||||
|
||||
"cloud.google.com/go/firestore"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
|
||||
pbaero "github.com/flowy-live/llink/genproto/aero"
|
||||
pbpusher "github.com/flowy-live/llink/genproto/llink/pusher"
|
||||
"github.com/flowy-live/llink/internal/db"
|
||||
@@ -15,12 +19,10 @@ import (
|
||||
"github.com/flowy-live/llink/internal/network"
|
||||
"github.com/flowy-live/llink/internal/particle"
|
||||
"github.com/flowy-live/llink/internal/utils"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
)
|
||||
|
||||
const (
|
||||
maxActivityAge = 24 * time.Hour // ignore streams idle longer than this
|
||||
maxActivityAge = 24 * time.Hour // ignore streams idle longer than this
|
||||
unreadThreshold = 10 * time.Minute // grace window before a message is "unread"
|
||||
emailCooldown = 12 * time.Hour // min gap between emails to the same user
|
||||
)
|
||||
@@ -34,7 +36,7 @@ func main() {
|
||||
gcpProject := utils.MustGetEnv("GCP_PROJECT")
|
||||
firestoreClient, err := firestore.NewClient(ctx, gcpProject)
|
||||
if err != nil {
|
||||
slog.Error("failed to create Firestore client", "error", err)
|
||||
flog.Error("failed to create Firestore client", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer firestoreClient.Close()
|
||||
@@ -42,7 +44,7 @@ func main() {
|
||||
aeroAddr := utils.MustGetEnv("AERO_ADDR")
|
||||
aeroConn, err := grpc.NewClient(aeroAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||
if err != nil {
|
||||
slog.Error("failed to connect to aero", "error", err)
|
||||
flog.Error("failed to connect to aero", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer aeroConn.Close()
|
||||
@@ -51,7 +53,7 @@ func main() {
|
||||
pusherAddr := utils.MustGetEnv("PUSHER_GRPC_ADDR")
|
||||
pusherConn, err := grpc.NewClient(pusherAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||
if err != nil {
|
||||
slog.Error("failed to connect to pusher", "error", err)
|
||||
flog.Error("failed to connect to pusher", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer pusherConn.Close()
|
||||
@@ -60,12 +62,12 @@ func main() {
|
||||
humanSvc := human.NewService(db.Pool())
|
||||
networkSvc := network.NewReader(db.Pool())
|
||||
|
||||
slog.Info("starting email notification cycle")
|
||||
flog.Info("starting email notification cycle")
|
||||
if err := runNotificationCycle(ctx, firestoreClient, aeroSvc, pusherSvc, humanSvc, networkSvc); err != nil {
|
||||
slog.Error("notification cycle failed", "error", err)
|
||||
flog.Error("notification cycle failed", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
slog.Info("email notification cycle complete")
|
||||
flog.Info("email notification cycle complete")
|
||||
}
|
||||
|
||||
func runNotificationCycle(
|
||||
@@ -100,7 +102,7 @@ func runNotificationCycle(
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get online humans: %w", err)
|
||||
}
|
||||
slog.Info("gathered online presence", "onlineCount", len(onlineResp.HumanIds), "humanIds", onlineResp.HumanIds)
|
||||
flog.Info("gathered online presence", "onlineCount", len(onlineResp.HumanIds), "humanIds", onlineResp.HumanIds)
|
||||
for _, id := range onlineResp.HumanIds {
|
||||
allOnline[id] = true
|
||||
}
|
||||
@@ -108,7 +110,7 @@ func runNotificationCycle(
|
||||
for _, net := range networks {
|
||||
streams, err := getOpenStreams(ctx, fsClient, net.ID)
|
||||
if err != nil {
|
||||
slog.Error("failed to query streams", "networkId", net.ID, "error", err)
|
||||
flog.Error("failed to query streams", "networkId", net.ID, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -141,7 +143,7 @@ func runNotificationCycle(
|
||||
sentCount := 0
|
||||
for humanId, count := range behindCounts {
|
||||
if allOnline[humanId] {
|
||||
slog.Info("human online...skipping email", "humanId", humanId)
|
||||
flog.Info("human online...skipping email", "humanId", humanId)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -164,18 +166,18 @@ func runNotificationCycle(
|
||||
}
|
||||
|
||||
if err := sendNotificationEmail(ctx, aeroSvc, h, count); err != nil {
|
||||
slog.Error("failed to send email", "humanId", humanId, "error", err)
|
||||
flog.Error("failed to send email", "humanId", humanId, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
if err := humanSvc.UpdateLastEmailNotificationSentAt(ctx, humanId, now); err != nil {
|
||||
slog.Error("failed to update last_email_notification_sent_at", "humanId", humanId, "error", err)
|
||||
flog.Error("failed to update last_email_notification_sent_at", "humanId", humanId, "error", err)
|
||||
}
|
||||
|
||||
sentCount++
|
||||
}
|
||||
|
||||
slog.Info("notification cycle summary",
|
||||
flog.Info("notification cycle summary",
|
||||
"networks", len(networks),
|
||||
"humansBehind", len(behindCounts),
|
||||
"emailsSent", sentCount,
|
||||
@@ -198,7 +200,7 @@ func getOpenStreams(ctx context.Context, client *firestore.Client, networkId str
|
||||
for _, doc := range docs {
|
||||
var s particle.FirestoreStreamParticle
|
||||
if err := doc.DataTo(&s); err != nil {
|
||||
slog.Warn("failed to unmarshal stream particle", "docId", doc.Ref.ID, "error", err)
|
||||
flog.Warn("failed to unmarshal stream particle", "docId", doc.Ref.ID, "error", err)
|
||||
continue
|
||||
}
|
||||
streams = append(streams, s)
|
||||
|
||||
Reference in New Issue
Block a user