RFC for event logging mechanism
Deepak Kodihalli
dkodihal at linux.vnet.ibm.com
Tue Sep 5 21:24:01 AEST 2017
Hello,
I'm working this sprint on designing an event logging mechanism
(https://github.com/openbmc/openbmc/issues/1856). I have a couple
proposals below along with some questions. Hoping to hear thoughts on
which might be a better proposal. Any other feedback is welcome.
Potential requirements
1) Applications should be able to log events of interest. Events could
be used for purposes such as telemetry, analytics, debug. Examples of
events could be changes in the power/thermal domain, such as operating
temps on a server, boot related, user account changes, etc.
2a) Users should be able to query events via REST.
2b) Users should also be able to query events of a certain category or type.
3) Users should also be able to "download" events in a format such as
JSON (This comes for free today with the rest server running on OpenBMC).
4) It should be possible to specify event metadata, which may have use
for a human as well as a program.
5) It should be possible to persist events up to a certain cap.
Proposal 1 - Leverage existing OpenBMC phosphor-logging
Phopshor-logging works as a supplement to journald - at a high level it
makes it possible to log errors to the journal, as well as create d-bus
objects representing the errors.
- Phosphor-logging uses the Entry interface [1] to describe an error. I
have [2] as the proposed Event interface. It's mostly similar to [1] -
differences being - I wasn't sure if we really need event severity and
resolution, plus having an event Category would be handy for handling
Requirement 2b).
- Phosphor-logging requires describing errors in yaml (error yaml and
error metadata yaml), which are processed [3] by a script that generates
an error log API, which clients can use. The API is part of a
phosphor-logging client lib. The same yaml structure can be utilized for
events, maybe with the yaml files themselves being named slightly
differently to depict events and event metadata instead of errors. This
means the client lib will have an event API, similar to the existing
elog API [6]. Error yaml files are stored either in the
phosphor-dbus-interfaces repo, or within an application's repo, based on
whether the error corresponds to a d-bus interface failure or not. In
case of events, I think the event yaml files can just be stored in the
app that creates them.
- The event logging API, in addition to logging to journal, will call an
internal phosphor-logging d-bus API, similar to [4], in order create a
d-bus object depicting the event. Based on the event Category, the d-bus
object will be placed in the right namespace, such as
/xyz/openbmc_project/logging/events/boot/ or
/xyz/openbmc_project/logging/events/thermal/. The phosphor-logging
process, hence, will own these d-bus objects, do the id management (per
category), etc.
Proposal 2 - Write d-bus interfaces to describe events
Couple of issues I see with Proposal 1 :
a) It's cumbersome for a BMC app to figure out that a specific event was
reported, or to express interest in a certain category of events. The
d-bus path namespace can help to a certain extent here though, but it's
based on paths and properties and not interfaces being added.
b) Both the existing Entry interface [1] and the proposed Event
interface [2] express metadata as strings, probably not the most elegant
way for an interested program to deal with them.
Given this, it feels more natural to express an event in it's own d-bus
interface, such as an Event.Boot or Event.Thermal interface. So, this
proposal looks like :
- Define an Event log interface [5]. Note that this is mostly like [2],
although it has an additional method to create the event d-bus object.
- For specific event types, define their own d-bus interfaces. I don't
have examples for these at the moment, but like I mentioned above, we
could have interfaces for Event.Boot and Event.Thermal to start with.
These interfaces could be placed in the phosphor-dbus-interfaces repo. A
phosphor-logging application will have the code to implement these
well-known event interfaces, and to basically create d-bus objects. This
app will also implement the "Notify" method defined in [5].
- An application interested in reporting an event will make a call to
the "Notify" API defined in [5], stating the event category and the
event metadata. The phosphor-logging application that implements
"Notify", will create d-bus objects based on the event Category and
metadata, and place them in appropriate d-bus path namespaces, similar
to Proposal 1. It can also log the event information to the journal,
though I am not sure why this would be required, aside from the having
the need to have the journal as the repo of all events.
[1]
https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Logging/Entry.interface.yaml
[2] https://gerrit.openbmc-project.xyz/#/c/6405/1
[3]
https://github.com/openbmc/phosphor-logging/blob/master/tools/elog-gen.py,
error yaml example :
https://github.com/openbmc/phosphor-dbus-interfaces/tree/master/xyz/openbmc_project/Dump
[4]
https://github.com/openbmc/phosphor-logging/blob/master/log_manager.cpp#L27
[5] https://gerrit.openbmc-project.xyz/#/c/6406/1
[6]
https://github.com/openbmc/phosphor-logging/blob/master/phosphor-logging/elog.hpp#L126
Regards,
Deepak
More information about the openbmc
mailing list