This change further plumbs the components required for implementing event filters. Specifically, we now have the ability to filter on the `topic` and `namespace`. In the course of implementing this functionality, it was found that there were mismatches in the events API that created extra serialization round trips. A modification to `typeurl.MarshalAny` and a clear separation between publishing and forwarding allow us to avoid these serialization issues. Unfortunately, this has required a few tweaks to the GRPC API, so this is a breaking change. `Publish` and `Forward` have been clearly separated in the GRPC API. `Publish` honors the contextual namespace and performs timestamping while `Forward` simply validates and forwards. The behavior of `Subscribe` is to propagate events for all namespaces unless specifically filtered (and hence the relation to this particular change. The following is an example of using filters to monitor the task events generated while running the [bucketbench tool](https://github.com/estesp/bucketbench): ``` $ ctr events 'topic~=/tasks/.+,namespace==bb' ... 2017-07-28 22:19:51.78944874 +0000 UTC bb /tasks/start {"container_id":"bb-ctr-6-8","pid":25889} 2017-07-28 22:19:51.791893688 +0000 UTC bb /tasks/start {"container_id":"bb-ctr-4-8","pid":25882} 2017-07-28 22:19:51.792608389 +0000 UTC bb /tasks/start {"container_id":"bb-ctr-2-9","pid":25860} 2017-07-28 22:19:51.793035217 +0000 UTC bb /tasks/start {"container_id":"bb-ctr-5-6","pid":25869} 2017-07-28 22:19:51.802659622 +0000 UTC bb /tasks/start {"container_id":"bb-ctr-0-7","pid":25877} 2017-07-28 22:19:51.805192898 +0000 UTC bb /tasks/start {"container_id":"bb-ctr-3-6","pid":25856} 2017-07-28 22:19:51.832374931 +0000 UTC bb /tasks/exit {"container_id":"bb-ctr-8-6","id":"bb-ctr-8-6","pid":25864,"exited_at":"2017-07-28T22:19:51.832013043Z"} 2017-07-28 22:19:51.84001249 +0000 UTC bb /tasks/exit {"container_id":"bb-ctr-2-9","id":"bb-ctr-2-9","pid":25860,"exited_at":"2017-07-28T22:19:51.839717714Z"} 2017-07-28 22:19:51.840272635 +0000 UTC bb /tasks/exit {"container_id":"bb-ctr-7-6","id":"bb-ctr-7-6","pid":25855,"exited_at":"2017-07-28T22:19:51.839796335Z"} ... ``` In addition to the events changes, we now display the namespace origin of the event in the cli tool. This will be followed by a PR to add individual field filtering for the events API for each event type. Signed-off-by: Stephen J Day <stephen.day@docker.com>
55 lines
1.6 KiB
Protocol Buffer
55 lines
1.6 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package containerd.services.events.v1;
|
|
|
|
import "gogoproto/gogo.proto";
|
|
import "google/protobuf/any.proto";
|
|
import "google/protobuf/empty.proto";
|
|
import "google/protobuf/timestamp.proto";
|
|
|
|
option go_package = "github.com/containerd/containerd/api/services/events/v1;events";
|
|
|
|
service Events {
|
|
// Publish an event to a topic.
|
|
//
|
|
// The event will be packed into a timestamp envelope with the namespace
|
|
// introspected from the context. The envelope will then be dispatched.
|
|
rpc Publish(PublishRequest) returns (google.protobuf.Empty);
|
|
|
|
// Forward sends an event that has already been packaged into an envelope
|
|
// with a timestamp and namespace.
|
|
//
|
|
// This is useful if earlier timestamping is required or when fowarding on
|
|
// behalf of another component, namespace or publisher.
|
|
rpc Forward(ForwardRequest) returns (google.protobuf.Empty);
|
|
|
|
// Subscribe to a stream of events, possibly returning only that match any
|
|
// of the provided filters.
|
|
//
|
|
// Unlike many other methods in containerd, subscribers will get messages
|
|
// from all namespaces unless otherwise specified. If this is not desired,
|
|
// a filter can be provided in the format 'namespace==<namespace>' to
|
|
// restrict the received events.
|
|
rpc Subscribe(SubscribeRequest) returns (stream Envelope);
|
|
}
|
|
|
|
message PublishRequest {
|
|
string topic = 1;
|
|
google.protobuf.Any event = 2;
|
|
}
|
|
|
|
message ForwardRequest {
|
|
Envelope envelope = 1;
|
|
}
|
|
|
|
message SubscribeRequest {
|
|
repeated string filters = 1;
|
|
}
|
|
|
|
message Envelope {
|
|
google.protobuf.Timestamp timestamp = 1 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
|
|
string namespace = 2;
|
|
string topic = 3;
|
|
google.protobuf.Any event = 4;
|
|
}
|