// SubscribeLogs creates a log subscription and streams back logs func (lb *LogBroker) SubscribeLogs(request *api.SubscribeLogsRequest, stream api.Logs_SubscribeLogsServer) error { ctx := stream.Context() if err := validateSelector(request.Selector); err != nil { return err } subscription := lb.newSubscription(request.Selector, request.Options) subscription.Run(lb.pctx) defer subscription.Stop() log := log.G(ctx).WithFields( logrus.Fields{ "method": "(*LogBroker).SubscribeLogs", "subscription.id": subscription.message.ID, }, ) log.Debug("subscribed") publishCh, publishCancel := lb.subscribe(subscription.message.ID) defer publishCancel() lb.registerSubscription(subscription) defer lb.unregisterSubscription(subscription) completed := subscription.Wait(ctx) for { select { case <-ctx.Done(): return ctx.Err() case <-lb.pctx.Done(): return lb.pctx.Err() case event := <-publishCh: publish := event.(*logMessage) if publish.completed { return publish.err } if err := stream.Send(&api.SubscribeLogsMessage{ Messages: publish.Messages, }); err != nil { return err } case <-completed: completed = nil lb.logQueue.Publish(&logMessage{ PublishLogsMessage: &api.PublishLogsMessage{ SubscriptionID: subscription.message.ID, }, completed: true, err: subscription.Err(), }) } } }
// SubscribeLogs creates a log subscription and streams back logs func (lb *LogBroker) SubscribeLogs(request *api.SubscribeLogsRequest, stream api.Logs_SubscribeLogsServer) error { ctx := stream.Context() if err := validateSelector(request.Selector); err != nil { return err } subscription := &api.SubscriptionMessage{ ID: identity.NewID(), Selector: request.Selector, Options: request.Options, } log := log.G(ctx).WithFields( logrus.Fields{ "method": "(*LogBroker).SubscribeLogs", "subscription.id": subscription.ID, }, ) log.Debug("subscribed") publishCh, publishCancel := lb.subscribe(subscription.ID) defer publishCancel() lb.registerSubscription(subscription) defer lb.unregisterSubscription(subscription) for { select { case event := <-publishCh: publish := event.(*api.PublishLogsMessage) if err := stream.Send(&api.SubscribeLogsMessage{ Messages: publish.Messages, }); err != nil { return err } case <-ctx.Done(): return ctx.Err() case <-lb.pctx.Done(): return nil } } }