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.