To ensure consistent fieldpath matching for events, we generate the fieldpath matching using protobuf definitions. This is done through a plugin called "fieldpath" that defines a `Field` method for each type with the plugin enabled. Generated code handles top-level envelope fields, as well as deferred serialization for matching any types. In practice, this means that we can cheaply match events on `topic` and `namespace`. If we want to match on attributes within the event, we can use the `event` prefix to address these fields. For example, the following will match all envelopes that have a field named `container_id` that has the value `testing`: ``` ctr events "event.container_id==testing" ``` The above will decode the underlying event and check that particular field. Accordingly, if only `topic` or `namespace` is used, the event will not be decoded and only match on the envelope. Signed-off-by: Stephen J Day <stephen.day@docker.com>
29 lines
713 B
Go
29 lines
713 B
Go
package main
|
|
|
|
import (
|
|
_ "github.com/containerd/containerd/protobuf/plugin/fieldpath"
|
|
"github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
|
|
"github.com/gogo/protobuf/vanity"
|
|
"github.com/gogo/protobuf/vanity/command"
|
|
)
|
|
|
|
func main() {
|
|
req := command.Read()
|
|
files := req.GetProtoFile()
|
|
files = vanity.FilterFiles(files, vanity.NotGoogleProtobufDescriptorProto)
|
|
for _, opt := range []func(*descriptor.FileDescriptorProto){
|
|
vanity.TurnOffGoGettersAll,
|
|
vanity.TurnOffGoStringerAll,
|
|
vanity.TurnOnMarshalerAll,
|
|
vanity.TurnOnStringerAll,
|
|
vanity.TurnOnUnmarshalerAll,
|
|
vanity.TurnOnSizerAll,
|
|
CustomNameID,
|
|
} {
|
|
vanity.ForEachFile(files, opt)
|
|
}
|
|
|
|
resp := command.Generate(req)
|
|
command.Write(resp)
|
|
}
|