[openstack-dev] [all] how to send messages (and events) to our users

Flavio Percoco flavio at redhat.com
Fri Apr 10 15:20:21 UTC 2015

On 10/04/15 10:00 -0400, Ryan Brown wrote:
>On 04/09/2015 09:40 PM, Angus Salkeld wrote:
>> On Fri, Apr 10, 2015 at 6:39 AM, Zane Bitter <zbitter at redhat.com
>> <mailto:zbitter at redhat.com>> wrote:
>>     On 06/04/15 22:55, Angus Salkeld wrote:
>>         Hi all
>>         For quite some time we (Heat team) have wanted to be able to send
>>         messages to our
>>         users (by user I do not mean the Operator, but the User that is
>>         interacting with the client).
>>         What do I mean by "user messages", and how do they differ from our
>>         current log messages
>>         and notifications?
>>         - Our current logs are for the operator and have information
>>         that the
>>         user should not have
>>            (ip addresses, hostnames, configuration options, other tenant
>>         info etc..)
>>         - Our notifications (that Ceilometer uses) *could* be used, but
>>         I am not
>>         sure if it quite fits.
>>            (they seem a bit heavy weight for a log message and aimed at
>>         higher
>>         level events)
>>         These messages could be (based on Heat's use case):
>>         - Specific user oriented log messages (distinct from our normal
>>         operator
>>         logs)
>>         - Deprecation messages (if they are using old resource
>>         properties/template features)
>>         - Progress and resource state changes (an application doesn't
>>         want to
>>         poll an api for a state change)
>>         - Automated actions (autoscaling events, time based actions)
>>         - Potentially integrated server logs (from in guest agents)
>>         I wanted to raise this to "[all]" as it would be great to have a
>>         general
>>         solution that
>>         all projects can make use of.
>>         What do we have now:
>>         - The user can not get any kind of log message from services. The
>>         closest thing
>>            ATM is the notifications in Ceilometer, but I have the
>>         feeling that
>>         these have a different aim.
>>         - nova console log
>>         - Heat has a DB "event" table for users (we have long wanted to
>>         get rid
>>         of this)
>>         What do other clouds provide:
>>         - https://devcenter.heroku.com/__articles/logging
>>         <https://devcenter.heroku.com/articles/logging>
>>         - https://cloud.google.com/__logging/docs/
>>         <https://cloud.google.com/logging/docs/>
>>         - https://aws.amazon.com/blogs/__aws/cloudwatch-log-service/
>>         <https://aws.amazon.com/blogs/aws/cloudwatch-log-service/>
>>         - http://aws.amazon.com/__cloudtrail/
>>         <http://aws.amazon.com/cloudtrail/>
>>         (other examples...)
>>         What are some options we could investigate:
>>         1. remote syslog
>>              The user provides a rsyslog server IP/port and we send their
>>         messages to that.
>>              [pros] simple, and the user could also send their server's log
>>         messages to the same
>>                        rsyslog - great visibility into what is going on.
>>                        There are great tools like
>>         loggly/logstash/papertrailapp
>>         that source logs from remote syslog
>>                        It leaves the user in control of what tools they
>>         get to use.
>>              [cons] Would we become a spam agent (just sending traffic to an
>>         IP/Port) - I guess that's how remote syslog
>>                         works. I am not sure if this is an issue or not?
>>                        This might be a lesser solution for the use case
>>         of "an
>>         application doesn't want to poll an api for a state change"
>>                        I am not sure how we would integrate this with
>>         horizon.
>>         2. Zaqar
>>              We send the messages to a queue in Zaqar.
>>              [pros] multi tenant OpenStack project for messaging!
>>              [cons] I don't think Zaqar is installed in most
>>         installations (tho'
>>         please correct me here if this
>>                         is wrong). I know Mirantis does not currently
>>         support
>>     I think you're correct for now, but I also think that the ability to
>>     send messages to the user side is a valuable enough feature to
>>     convince many cloud operators to deploy it. Everybody wins in that case.
>>         Zaqar, so that would be a problem for me.
>>                        There is not the level of external tooling like
>>         in option
>>         "1" (logstash and friends)
>>     IMO whatever solution we choose is going to end up requiring the
>>     same semantics as Zaqar: durable storage, timeouts of stale
>>     messages, arbitrary scale-out, multi-tenancy with Keystone auth,
>>     pub-sub, and so on. That leaves us with 3 options:
>>     1) Use Zaqar
>>     2) Write a ground-up replacement for Zaqar. I hope we can agree that
>>     this is insane. Particularly if our reason for not using Zaqar is
>>     that it isn't widely deployed enough yet.
>>     3) Write or make use of something much simpler than Zaqar that
>>     implements only the exact subset of Zaqar's semantics that we need.
>>     However, IMHO that is very likely to turn out to be substantially
>>     all of them, and once again this is unlikely to solve the problem of
>>     wide deployment before Zaqar.
>>     So, in conclusion, +1 Zaqar.
>>     However, there are some other interesting questions posed by your email.
>>     - Do we need a separate service to condition the output to a
>>     different protocol? IMHO no - or, rather, not beyond the ones
>>     already proposed for Zaqar (long polling, WebSockets, SNS-style
>>     notifications). Even if there was some better protocol (in principle
>>     I'm not opposed to Atom, for example), I think we'd benefit more by
>>     just adding support for it in Zaqar - if it works for this use case
>>     then it will work for others that users commonly have.
>>     - What should be feeding inputs into the queue? Some service that
>>     consumes the existing oslo messaging notifications and sanitises
>>     them for the user?
>> I think if we use Zaqar, it would be madness to not do this. *But* we
>> have to be really careful we don't end up sending sensitive deployment
>> information
>> to the user.
>>     Or would every service publish its user notifications directly to
>>     the queue? I think this might vary on a case-by-case basis. For
>>     things like log messages, warnings and the like, I can see that
>>     having a single place to configure it would be valuable. For other
>>     things, like the hooks we just added in Heat to allow the user to
>>     insert their own actions into Heat's workflow, it may make more
>>     sense for the user to explicitly provide the Zaqar topic they want
>>     notification on. Which leads to a final question:
>>     - Are there different use cases here that require different
>>     solutions? I'm pretty sure that Zaqar is the Right Thing for things
>>     like Heat workflow hooks, Ceilometer alarms, triggering Mistral
>>     workflows, &c. However we should at least consider the possibility
>>     that there's a better fit for the more logging-like things. As I
>>     mentioned, I think on the back end they will likely look quite
>>     different. I'd like to think that the user-facing part could be the
>>     same, but it would be interesting to hear from anyone who disagrees.
>>     In particular, if we were to go as far as allowing users to use the
>>     same mechanism for their own application logging, then Zaqar would
>>     probably not be the best channel for it.
>> Use cases:
>> 1. structured-logging/events/notifications that the end user can access
>> (the main use case I am trying to solve here)
>>    - for heat this would be a replacement to our event table and enable
>> us to send more events (so we don't have to worry about burning up our
>> db with events)
>>    - for any other service this would be a great new feature that allows
>> the user more insight into what is happening with their resources.
>> 2. Heat's two way comms with the user (hooks?)
>>   - I am not at all covering that use case in this discussion - I think
>> a completely different issue.
>> 3. Ceilometer/Monasca alarms
>> (the assumption is that besides webhooks we add other transports)
>> - Again I wasn't trying to solve this problem - but could be in-scope.
>> 4. integration with in-server logging
>> (your server applications log to syslog, the question is can we get that
>> logging "nicely" to the user
>>  and potentially integrate with "1." - this was more of a nice-to-have)
>> - for a nice example of how this can be
>> done: https://devcenter.heroku.com/articles/logging
>> Could Zaqar fulfil all of these use case? - Maybe.
>Zaqar as it presently exists, maybe. Zaqar *wants* to fit these cases,
>and they want our feedback if they are missing anything to support these.

Yes, please. I'd go a bit further than this and say we're willing to
help on getting this done as that'll be one of the things the team
will focus on in the next cycle.

>The biggest stretch here IMO is (4) because not all Zaqar storage
>backends support strict ordering, but that can be fixed at the
>application layer.

Correct, right now the mongodb storage is the only one with support
for FIFO. This has been made optional in Kilo.


Flavio Percoco
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20150410/c49354b5/attachment.pgp>

More information about the OpenStack-dev mailing list