Hi all, Thanks for your responses, JB and Russell. I agree with the points made by Russell: * There are no major API changes/additions introduced that would require a new interface-only PR. * Taking Russell’s suggestions do not change anything that was mentioned in the first email in this thread.
As part of the delegator pattern refactor I have committed to do on PR#1904, I will firstly introduce a (new) PR to make (no-op) delegator classes for all the major Service APIs that are in Polaris based on this feedback from Russell. Then, I can re-introduce PR#1904 with the new Events Delegator. Best, Adnan Hemani > On Aug 21, 2025, at 8:47 AM, Russell Spitzer <russell.spit...@gmail.com> > wrote: > > I think the problem here is that we already have merged some apis, see > PolarisEventListener > <https://www.google.com/url?q=https://github.com/apache/polaris/blob/main/runtime/service/src/main/java/org/apache/polaris/service/events/PolarisEventListener.java&source=gmail-imap&ust=1756396128000000&usg=AOvVaw2hdz6gzSGLsSorYUn3gOdy>. > The Pr's above extend that pattern and add more. If I understand Robert's > request, he would like to remove the previously merged APIs and would like > the whole interface to go back to the drawing board to switch to a Stateful > Event handling system. So I'm not sure an "API Only" PR would help in this > case since the objection is not just to these changes, but to previously > merged ones. > > Currently we have a callback style pattern, and I wouldn't consider adding > more callbacks as normally requiring any sort of discussion (each api is > just "onBefore", "onAfter" although I guess we could argue about their > object contents but I don't think they are that broad). Adding > additional callbacks for errors/exceptions also wouldn't be a huge deal and > could always be done later as well. > > The change to stateful event APIs I believe is to allow for a plugin which > allows injection of external state into the event processing as it takes > place. I'm assuming that if you perhaps had an implementation specific > identifier you wanted for an event which was required for performance, you > would need this sort of API. If you just needed to track an event, > RequestID is available but I'm guessing there is a system here which > wouldn't be able to easily correlate items based on a system provided > identifier? If there are other use cases I'd like to know about them since > I'm also wary of putting too much event processing logic into Polaris > itself so I'm skeptical about the cost/benefit of allowing this. > > I am confident that even if we did decide as a community to go ahead with a > Stateful event listener API, we wouldn't have to drop the existing apis > since it would be trivial to automatically wrap a callback event listener > with a stateful one. So I probably would also not block the existing PR's > unless we were, as I noted above, going to rip out all the event apis. > > I think if we did want to switch to a Stateful event handling that it's > probably on those requesting a different API layout to propose that and > write up the design document on how that pattern would be helpful to users > of Polaris and what the pros and cons would be especially in context of > what we already have in the project. > > I do think one pretty good path forward though would be to first develop > the interfaces and patterns required to fully delegate to PolarisCoreImpl > as Robert requested. If we do that, then any implementer could just load > their own wrapping class which could use whatever eventing pattern they > like even if it doesn't match Polaris official apis > (StatefulEventDelegatingPolarisCore or CallbackEventDelegatingPolarisCore - > These could always be built on the vendor side as well). There are of > course some cons to this approach as well by adding yet another level of > inter-direction but if we add that layer, and only some users want call > backs and not allow stateful event handling, they could do that without a > lot of fuss just by making their own delegating class. > > On Thu, Aug 21, 2025 at 1:04 AM Jean-Baptiste Onofré <j...@nanthrax.net> > wrote: > >> Hi Adnan >> >> Thanks for the message with the list of PRs and details. >> >> May I propose to create another PR focusing on API updates ? I quickly >> took a look on the PRs and my understanding is that these PRs update >> the API. >> I propose we start with a simple PR focusing on API change (easily to >> review and discuss). The purpose is to give "visibility" to the >> community and speed up on the implementation side as soon as we have >> consensus on API. >> >> Thoughts ? >> >> Thanks ! >> Regards >> JB >> >> On Tue, Aug 19, 2025 at 9:08 AM Adnan Hemani >> <adnan.hem...@snowflake.com.invalid> wrote: >>> >>> Hi all, >>> >>> Thanks to those who could make the Polaris Community Sync regarding the >> Events API on 2025-08-18. Below are the notes (and my further thoughts >> regarding the discussion topics) from the meeting. As discussed (without >> any expressed disagreement), there will be a one-week window (ending on >> 2025-08-25) to express any blocking concerns with any of the approaches or >> proposals, and a further one week window to then suggest any approaches to >> resolve these concerns (ending on 2025-09-01). Not responding within these >> time windows will be considered “reached consensus.” Please ensure any >> responses clearly indicate which proposal/PR the comments or feedback are >> for - or feel free to comment/review on the PRs directly! >>> >>> Thanks to the whole community for helping to move the Events feature >> forward! >>> >>> Proposal #1 - PR #1904 >>> <https://www.google.com/url?q=https://github.com/apache/polaris/pull/1904&source=gmail-imap&ust=1756396128000000&usg=AOvVaw2k-D9sN19JSXK7nkfvfDQT>: >> Additional Instrumentation for New Events >>> >>> As discussed at the sync, there are no notable changes to the Events and >> Event Listener interfaces within this PR - this proposal solely adds new >> instrumentation for events using the existing interfaces and emulates >> current implementations of said interfaces. >>> >>> Regarding concerns of adding too many files within this PR: I have >> committed to refactoring all Event records into a shared Java class. I will >> push this change with the next revision. >>> Regarding concerns of adding too much code within the business logic: I >> can commit to refactoring `PolarisServiceImpl.java` to create a delegator >> pattern where each method would emit events in a separate Java class and >> delegate back to `PolarisServiceImpl.java`. This could look something like >> Appendix 1. This pattern should satisfy the ability for someone (in a >> future PR) to implement `onError…` methods, in case we would like to do >> error handling using the Events API. To be clear, error handling was not a >> stated use-case of the Events API - but looks to be a straightforward >> extension. >>> Regarding concerns of the “lack of functionality” to correlate >> before/after events together: >>> As stated at the sync, this is a false statement. There is a way to do >> this already - but it is up to the Event Listener implementation to make >> this happen. >>> All to-date-publicized alternatives would also need to handle the logic >> of correlating before/after events within the Event Listener >> implementation, and so I cannot consider them as “strictly better”. The >> alternatives would also change the easy-to-implement interfaces to more >> complex ones, which is a significant drawback to this feature. Any >> interface that requires user implementation should always be as simple as >> possible. >>> There is not any concrete/known use case for this requirement, nor was >> it considered an original goal of the Events API. Given all the above, it >> is currently hard for me to understand this as a blocker for merging >> further event instrumentation with the current set of interfaces. >>> On a related note, any major changes to the Event interfaces would >> already need to be considered as “breaking changes,” as it is already >> released and public within our Polaris 1.0.0 release. >>> There is also a potential solution to pass in the “before” event ID with >> a small backwards-compatible change to the Events Listener interface >> (Appendix 2). I’m happy to field questions on this proposed change in an >> unrelated thread to PR #1904, either on Slack or in a different mail thread. >>> >>> Many thanks to Russell Spitzer for helping to identify some of the >> solutions listed above! >>> >>> — >>> >>> Proposal #2 - PR #1844 >>> <https://www.google.com/url?q=https://github.com/apache/polaris/pull/1844&source=gmail-imap&ust=1756396128000000&usg=AOvVaw0xoAGoP_bKPkfBdKjWCqgh> >> Add Polaris Events to Persistence >>> >>> This was not thoroughly discussed during the Community Sync due to lack >> of time, but was touched upon briefly whenever it was relevant as a new >> sample implementation of the Events Listener interface. >>> >>> There are currently no unaddressed concerns or comments on this PR. I am >> surfacing this as a way for a “last call” for feedback before this gets >> merged. >>> >>> — >>> >>> Proposal #3 - PR #1965 >>> <https://www.google.com/url?q=https://github.com/apache/polaris/pull/1965&source=gmail-imap&ust=1756396128000000&usg=AOvVaw1t2kJ7pb74RoBigmBamPhe> >> Add Event Listener Implementation using AWS CloudWatch as a event sink >>> >>> This was not mentioned during the community sync due to lack of time as >> well. The goal is hopefully to repeat the patterns in this PR for other >> cloud service provider logging products. >>> >>> There are a few minor comments remaining on this PR, which I will >> address in the upcoming days. There are plans to merge this PR following >> that resolution. This is an also being surfaced for a “last call” for >> feedback. >>> >>> Regards, >>> Adnan Hemani >>> >>> — >>> >>> Appendix 1: >>> >>> EventingPolarisServiceImpl.java: >>> ``` >>> public class EventingPolarisServiceImpl implements >> PolarisCatalogsApiSerivce, PolarisPrincipalsApiService, >> PolarisPrincipalsRolesApiService { >>> private final PolarisServiceImpl delegate; >>> private final PolarisEventListener listener; >>> >>> public … createCatalog(…) { >>> listener.onBeforeCreateCatalog(…); >>> try { >>> delegate.createCatalog(…); >>> listener.onAfterCreateCatalog(…); >>> } catch (Exception e) { >>> listener.onExceptionCreateCatalog(…); >>> } >>> } >>> } >>> ``` >>> >>> Appendix 2: >>> >>> EventingPolarisServiceImpl.java: >>> ``` >>> public class EventingPolarisServiceImpl implements >> PolarisCatalogsApiSerivce, PolarisPrincipalsApiService, >> PolarisPrincipalsRolesApiService { >>> private final PolarisServiceImpl delegate; >>> private final PolarisEventListener listener; >>> >>> public … createCatalog(…) { >>> String eventId = listener.onBeforeCreateCatalog(…); >>> try { >>> delegate.createCatalog(…); >>> listener.onAfterCreateCatalog(<event>, eventId); >>> } catch (Exception e) { >>> listener.onExceptionCreateCatalog(<event>, >> eventId); >>> } >>> } >>> ``` >>> >>> PolarisEventListener.java: >>> ``` >>> … >>> // The Event Listener implementation would then be in charge of >> generating the eventId and returning it… >>> public String onBeforeCreateCatalog(…) {} >>> >>> // …as well as using it further (if it would like). >>> public void onAfterCreateCatalog(<event>, String eventId) {} >>> >>> // We can achieve backwards compatibility through sending in `null` as >> the event ID. >>> // Event Listener implementations would need to handle this case. >>> // Additionally, we can mark this as Deprecated, if it makes for easier >> maintenance >>> public void onAfterCreateCatalog(<event>) { >>> onAfterCreateCatalog(<events>, null); >>> } >>> >>> // No need to handle backwards-compatibility here as this is not yet >> created and is still a proposal. >>> public void onExceptionCreateCatalog(<event>, String eventId) {} >>> … >>> ``` >>