metropolis/pkg/logtree: allow logging external leveled payloads
This is in preparation for making the mechanism to ingest external
logging more generic (currently we have an ad-hoc solution for klog, but
we now also want to implement one for etcd).
Change-Id: I6e6f656e5d83ad22d67a81fbeb87c8d369796e18
Reviewed-on: https://review.monogon.dev/c/monogon/+/207
Reviewed-by: Leopold Schabel <leo@nexantic.com>
diff --git a/metropolis/pkg/logtree/logtree_publisher.go b/metropolis/pkg/logtree/logtree_publisher.go
index 6106b19..25dfc5a 100644
--- a/metropolis/pkg/logtree/logtree_publisher.go
+++ b/metropolis/pkg/logtree/logtree_publisher.go
@@ -81,6 +81,25 @@
n.tree.journal.notify(e)
}
+// LogExternalLeveled injects a ExternalLeveledPayload into a given
+// LeveledLogger. This should only be used by systems which translate external
+// data sources into leveled logging - see ExternelLeveledPayload for more
+// information.
+func LogExternalLeveled(l LeveledLogger, e *ExternalLeveledPayload) error {
+ n, ok := l.(*node)
+ if !ok {
+ return fmt.Errorf("the given LeveledLogger is not a logtree node")
+ }
+ p := e.sanitize()
+ entry := &entry{
+ origin: n.dn,
+ leveled: p,
+ }
+ n.tree.journal.append(entry)
+ n.tree.journal.notify(entry)
+ return nil
+}
+
// log builds a LeveledPayload and entry for a given message, including all related
// metadata. It will create a new entry append it to the journal, and notify all
// pertinent subscribers.